COM,VARIANT包含BSTR。谁分配?

时间:2008-11-04 09:42:42

标签: c++ windows 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中执行此操作的模式是什么?我应该如何传递包含已分配字符串的VARIANT,使该字符串可用于其他线程,即使调用AddProperty的线程首先死亡,并正确地取消分配字符串?

1 个答案:

答案 0 :(得分:14)

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

编辑:哦,如果你想了解更多关于COM编程的信息,请务必通过“Don Box”获得“Essential COM”。 Don Box是 的COM大师,那本书几乎可以教你任何你想知道的关于COM等的东西;)