好的,所以我真的想不出一个可以概括这一点的适当名称。
IPrintPipelinePropertyBag接口(interface)具有AddProperty方法,该方法足够“将属性添加到属性包”。
http://msdn.microsoft.com/en-us/library/aa506384.aspx
我们使用以下代码将字符串添加到属性包。
CComVariant varProperty = CComBSTR(someString);
pPrintPropertyBag->AddProperty(L"SOME_PROPERTY", &varFilename);
但是,很明显,所创建的CComBSTR和CComVariant会在一段时间后超出范围。我不确定PropertyBag是否处理字符串并制作自己的拷贝。由于我们可以将各种东西存储在VARIANT中,因此情况并非如此。
假设未处理字符串,我的问题是,在COM中执行此操作的模式是什么?我应该如何传递一个包含已分配字符串的VARIANT,即使调用AddProperty的线程先死,该字符串也可用于其他线程,并正确地取消分配该字符串?
最佳答案
在大多数情况下,当您使用字符串或VARIANTs调用COM函数时,唯一需要保证的是这些对象在整个调用过程中都可用。调用之后,对象本身负责复制数据。例如,VARIANT将很可能使用VariantCopy函数,该函数将复制字符串,复制COM对象(增加引用计数)。
您唯一需要担心的是在VARIANT中传递实际接口(interface)时:在这种情况下,应该对接口(interface)进行正确的引用计数,并且应该相应地实现QueryInterface,AddRef和Release。并且永远不要在引用计数达到0之前取消分配该对象;)
编辑:哦,如果您想了解有关COM编程的更多信息,请确保通过“Don Box”获得“Essential COM”。 Don Box是COM专家,而那本书将教您几乎所有您想了解的COM知识;以及
关于c++ - COM,包含BSTR的VARIANT。谁分配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/261357/