谁能解释一下,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/