好的,所以我真的不能想到一个总结这个的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的线程首先死亡,并正确地取消分配字符串?
答案 0 :(得分:14)
在大多数情况下,当您使用字符串或VARIANT调用COM函数时,唯一需要的是,这些对象在整个调用过程中都可用。在调用之后,对象本身负责制作数据的副本。例如,VARIANT很可能会使用VariantCopy函数来复制字符串,复制COM对象(增加引用计数)。 您唯一需要担心的是当您在VARIANT中传递实际接口时:在这种情况下,接口应该正确引用计数,并且QueryInterface,AddRef和Release都应该相应地实现。并且在引用计数达到0之前不要释放该对象;)
编辑:哦,如果你想了解更多关于COM编程的信息,请务必通过“Don Box”获得“Essential COM”。 Don Box是 的COM大师,那本书几乎可以教你任何你想知道的关于COM等的东西;)