gpt4 book ai didi

visual-c++ - COM 中 CComPtr 优于 CComQIPtr 的用途是什么?

转载 作者:行者123 更新时间:2023-12-04 03:38:13 27 4
gpt4 key购买 nike

任何人都可以解释一下,COM 中 CComPtr 而不是 CComQIPtr 的用途是什么?

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

最佳答案

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

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

这样,您可以从指向任何(不相关)COM 接口(interface)的指针请求接口(interface),并检查该请求是否成功。
CComPtr用于管理肯定支持某些接口(interface)的对象。您可以将其用作具有引用计数的常用智能指针。就像 CComQIPtr ,但不允许上述用例,这为您提供了更好的类型安全性。

这段代码:
IUnknown* unknown = ... ;
CComQIPtr<IDispatch> dispatch( unknown );

如果 unknown 编译并可能产生一个空指针绑定(bind)到未实现 IDispatch 的对象.您现在必须在运行时检查它,如果您首先想要运行时检查,这很好,但如果您更喜欢编译时类型检查,则不好。

这段代码:
IUnknown* unknown = ... ;
CComPtr<IDispatch> dispatch( unknown );

根本不会编译 - 它会产生

error C2664: 'ATL::CComPtr::CComPtr(IDispatch *) throw()' : cannot convert parameter 1 from 'IUnknown *' to 'IDispatch *'



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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com