WEB开发网
开发学院软件开发VC 用ATL建立轻量级的COM对象(2) 阅读

用ATL建立轻量级的COM对象(2)

 2006-07-21 11:44:36 来源:WEB开发网   
核心提示: void f(IPersist *pPersist) {CComQIPtr<IPersist, &IID_IPersist> p;// 同类赋值 - AddRef''sp = pPersist;CComQIPtr<IDataObject, &IID_IDa

void f(IPersist *pPersist) {
     CComQIPtr<IPersist, &IID_IPersist> p;
     // 同类赋值 - AddRef''s
     p = pPersist;
  
     CComQIPtr<IDataObject, &IID_IDataObject> do;
     // 异类赋值 - QueryInterface''s
     do = pPersist;
   }
  在第二种赋值语句中,因为pPersist是非IDataObject *类型,但它是派生于IUnknown的接口指针,CComQIPtr通过pPersist调用QueryInterface来试图获得这个对象的IDataObject接口指针。如果QueryInterface调用成功,则此智能指针将含有作为结果的原始IDataObject指针。如果QueryInterface调用失败,则do.p将被置为null。如果QueryInterface返回的HRESULT值很重要,但又没有办法从赋值操作获得其值时,则必须显式调用QueryInterface。

既然有了CComQIPtr,那为什么还要CComPtr呢?由几个理由:首先,ATL最初的发布版本只支持CComPtr,所以它就一直合法地保留下来了。其二(也是最重要的理由),由于重载的构造函数和赋值操作,对IUnknown使用CComQIPtr是非法的。因为所有COM接口的类型定义都必须与IUnknown兼容。

CComPtr<IUnknown> unk;从功能上将它等同于 CComQIPtr<IUnknown, &IID_IUnknown> unk;前者正确。后者是错误的用法。如果你这样写了,C++编译器将提醒你改正。

将CComPtr作为首选的另外一个理由可能是一些开发人员相信静悄悄地调用QueryInterface,没有警告,削弱了C++系统的类型。毕竟,C++在没有进行强制类型转换的情况下不允许对类型不一致的原始指针 进行赋值操作,所以为什么要用智能指针的道理也在这,幸运的是开发人员可以选择最能满足需要的指针类型。

上一页  1 2 3 4 5 6  下一页

Tags:ATL 建立 轻量级

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接