C++ COM,包含BSTR的变体。谁分配?

C++ COM,包含BSTR的变体。谁分配?,c++,windows,com,variant,bstr,C++,Windows,Com,Variant,Bstr,好吧,所以我真的想不出一个恰当的标题来概括这一点 IPrintPipelinePropertyBag接口具有AddProperty方法,该方法非常恰当地“将属性添加到属性包” AddProperty([in,string]常量) wchar_t*pszName,[in]常数 变体*pVar) 我们使用以下代码向属性包添加字符串 CComVariant varProperty = CComBSTR(someString); pPrintPropertyBag->AddProperty(L"

好吧,所以我真的想不出一个恰当的标题来概括这一点

IPrintPipelinePropertyBag接口具有AddProperty方法,该方法非常恰当地“将属性添加到属性包”

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

我们使用以下代码向属性包添加字符串

CComVariant varProperty = CComBSTR(someString);
pPrintPropertyBag->AddProperty(L"SOME_PROPERTY", &varFilename);
不过,很明显,创建的CComBSTR和CComVariant在一段时间后超出了范围。我不确定PropertyBag是否处理字符串并创建自己的副本。因为我们可以在一个变体中存储各种各样的东西,所以情况不应该是这样


假设字符串没有被处理,我的问题是,在COM中这样做的模式是什么?如何传递包含已分配字符串的变量,使该字符串可用于其他线程,即使调用AddProperty的线程先死亡,并正确地取消分配字符串?

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

编辑:哦,如果你想了解更多关于COM编程的知识,请务必通过“Don Box”获取“Essential COM”。Don Box是COM大师,这本书将教给你几乎任何你想知道的关于COM和更多的东西;)