c – COM,VARIANT包含BSTR.谁分配?

好的,所以我真的不能想到一个概括这一点的apropos标题.

IPrintPipelinepropertybag接口具有AddProperty方法,它足以“将属性添加属性包”.

http://msdn.microsoft.com/en-us/library/aa506384.aspx

AddProperty( [in,string] const
wchar_t *pszName,[in] const
VARIANT *pVar );

我们使用以下代码属性包中添加一个字符串.

CComVariant varProperty = CComBSTR(someString);
pprintpropertybag->AddProperty(L"SOME_PROPERTY",&varFilename);

然而,很明显,创建的CComBSTR和CComVariant过了一段时间就超出了范围.我不知道propertybag是否处理该字符串并使其自己的副本.由于我们可以将各种东西存储在VARIANT中,所以不应该是这样.

假设字符串没有被处理,我的问题是在COM中做什么样的模式?即使传递调用AddProperty的线程首先死机,并且正确地分配字符串,我应该如何传递包含已分配字符串的VARIANT,使该字符串可用于其他线程.

解决方法

在大多数情况下,当使用字符串或VARIANT调用COM函数时,唯一需要的是,这些对象在整个调用本身都可用.通话后,对象本身负责复制数据.例如,VARIANT将很可能使用Variantcopy函数来复制字符串,复制COM对象(增加引用计数).
您唯一应该担心的是当您在VARIANT中传递实际的界面时:在这种情况下,应该正确引用接口,并且QueryInterface,AddRef和Release都应该被相应地实现.并且在引用计数达到0之前不要释放该对象;)

编辑:哦,如果你想更多地了解COM编程,一定要通过“Don Box”得到“Essential COM”. Don Box是COM的大师,那本书将会教你几乎任何你想知道的COM和更多的东西;)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...