【问题标题】:COM, VARIANT containing BSTR. Who allocates?COM, VARIANT 包含 BSTR。谁分配?
【发布时间】:2010-09-20 15:42:09
【问题描述】:

好的,所以我真的想不出一个恰当的标题来总结这一点。

IPrintPipelinePropertyBag 接口具有 AddProperty 方法,该方法恰如其分地“将属性添加到属性包”。

http://msdn.microsoft.com/en-us/library/aa506384.aspx

AddProperty( [in, string] 常量 wchar_t *pszName, [in] 常量 变体 *pVar );

我们使用下面的代码在属性包中添加一个字符串。

CComVariant varProperty = CComBSTR(someString);
pPrintPropertyBag->AddProperty(L"SOME_PROPERTY", &varFilename);

但很明显,所创建的 CComBSTR 和 CComVariant 会在一段时间后超出范围。我不确定 PropertyBag 是否处理字符串并制作自己的副本。由于我们可以在 VARIANT 中存储各种内容,因此不应该这样。

假设未处理字符串,我的问题是,在 COM 中执行此操作的模式是什么?我应该如何传递一个包含已分配字符串的 VARIANT,即使调用 AddProperty 的线程先死亡,也使该字符串可用于其他线程,并正确取消分配该字符串?

【问题讨论】:

    标签: c++ windows com variant bstr


    【解决方案1】:

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

    编辑:哦,如果您想了解更多关于 COM 编程的知识,请务必阅读“Don Box”的“Essential COM”。 Don Box 是 COM 大师,这本书几乎可以教给你任何你想知道的关于 COM 的知识以及更多内容;)

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 2019-10-24
      • 1970-01-01
      • 2015-12-29
      • 2010-10-26
      • 1970-01-01
      • 2016-06-15
      • 2012-05-14
      • 2018-05-17
      相关资源
      最近更新 更多