好的,所以我真的不能想到一个概括这一点的apropos标题.
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中做什么样的模式?即使传递调用AddProperty的线程首先死机,并且正确地分配字符串,我应该如何传递包含已分配字符串的VARIANT,使该字符串可用于其他线程.
解决方法
在大多数情况下,当使用字符串或VARIANT调用COM函数时,唯一需要的是,这些对象在整个调用本身都可用.通话后,对象本身负责复制数据.例如,VARIANT将很可能使用VariantCopy函数来复制字符串,复制COM对象(增加引用计数).
您唯一应该担心的是当您在VARIANT中传递实际的界面时:在这种情况下,应该正确引用接口,并且QueryInterface,AddRef和Release都应该被相应地实现.并且在引用计数达到0之前不要释放该对象;)
您唯一应该担心的是当您在VARIANT中传递实际的界面时:在这种情况下,应该正确引用接口,并且QueryInterface,AddRef和Release都应该被相应地实现.并且在引用计数达到0之前不要释放该对象;)
编辑:哦,如果你想更多地了解COM编程,一定要通过“Don Box”得到“Essential COM”. Don Box是COM的大师,那本书将会教你几乎任何你想知道的COM和更多的东西;)