COM,包含BSTR的VARIANT。谁分配内存?

9

好的,所以我无法想到一个恰当的标题来概括这个。

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个回答

14
当您使用字符串或VARIANT调用COM函数时,大多数情况下需要的唯一保证是这些对象在调用本身期间是可用的。在调用之后,对象本身负责复制数据。例如,VARIANT将很可能使用VariantCopy函数来复制字符串、复制COM对象(增加引用计数)。
唯一需要担心的是当您在VARIANT中传递实际接口时,在这种情况下,接口应正确地引用计数,并相应地实现QueryInterface、AddRef和Release。并且在引用计数达到0之前不要清除该对象 ;)
编辑:哦,如果您想了解更多关于COM编程的内容,请务必获取“Essential COM” by “Don Box”。Don Box是COM大师,这本书将教您几乎所有您想知道的关于COM的东西以及更多的内容;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接