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 的线程先死亡,也使该字符串可用于其他线程,并正确取消分配字符串?

4

1 回答 1

14

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

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

于 2008-11-04T09:48:18.007 回答