谁能解释一下,COM中CComPtr优于CComQIPtr的用途是什么?

CComPtr<ISampleInterface> Sample1;
CComQIPtr<ISampleInterface> Sample2;

最佳答案

CComQIPtr用于想要以便捷方式调用QueryInterface()来了解是否支持接口的情况:

IInterface1* from = ...
CComQIPtr<IInterface2> to( from );
if( to != 0 ) {
   //supported - use
}


这样,您可以从指向任何(不相关)COM接口的指针请求接口,并检查该请求是否成功。

CComPtr用于管理肯定支持某些接口的对象。您可以将其用作参考计数的常用智能指针。它类似于CComQIPtr,但是不允许上述用例,因此可以提供更好的类型安全性。

这段代码:

IUnknown* unknown = ... ;
CComQIPtr<IDispatch> dispatch( unknown );


如果unknown绑定到未实现IDispatch的对象,则编译并可能生成空指针。现在,您必须在运行时中进行检查,如果您首先要进行运行时检查,则很好,但如果您希望进行编译时类型检查,则不好。

这段代码:

IUnknown* unknown = ... ;
CComPtr<IDispatch> dispatch( unknown );


根本不会编译-它产生


错误C2664:'ATL :: CComPtr :: CComPtr(IDispatch *)throw()':无法将参数1从'IUnknown *'转换为'IDispatch *'


这提供了更好的编译时类型安全性。

关于visual-c++ - COM中CComPtr优于CComQIPtr的用途是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6844943/

10-09 06:24