6

我正在浏览一些处理 Windows 映像组件库的遗留 C++ 代码,我观察到了这一点:

void setProperties(IPropertyBag2* const pBag)
{  
   pBag->Write(...);
}

void other_function()
{
   CComPtr<IPropertyBag2> pBag;
   //Code to initialize pBag
   setProperties(pBag);
}

setProperties方法只是将一堆属性写入属性包。代码编译并运行良好,因为我认为它调用了适当的类型转换运算符。

我的问题是是否推荐这样的接口,或者是否有更好的方法来传递指针。例如,如果将签名更改为:是否有任何区别(在安全/性能方面):

void setProperties(const CComPtr<IPropertyBag2>& pBag)
4

2 回答 2

2

原始接口指针是处理 COM 对象的规范方式。它们也是最灵活的。使用对 CComPtr 的引用将使您始终使用 CComPtr。

任何 COM 指针,即使是愚蠢的指针,都会自动成为智能指针,因为对象本身实现了AddRefRelease. 如果函数没有保留指针的副本,则甚至无需担心。

为方便起见,CComPtr 类型将自动将自身转换为原始指针。

于 2012-09-21T02:30:03.770 回答
1

使用 CComPtr 参数并没有太多优势(除非它是非常量并且您要修改它)。CComPtr 对于局部变量和实例变量更有用。

但这样做是可以的,如果只是为了风格/一致性的问题。

于 2012-09-21T02:16:44.097 回答