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

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

 2006-07-21 11:44:36 来源:WEB开发网   
核心提示: void f(void) { CComPtr<IUnknown> rgpUnk[3]; if (FAILED(GetObject(&rgpUnk[0]))) return; if (FAILED(GetObject(&rgpUnk[1]))) return; if (FAILE

void f(void) {
  CComPtr<IUnknown> rgpUnk[3];
  if (FAILED(GetObject(&rgpUnk[0]))) return;
  if (FAILED(GetObject(&rgpUnk[1]))) return;
  if (FAILED(GetObject(&rgpUnk[2]))) return;
  UseObjects(rgpUnk[0], rgpUnk[1], rgpUnk[2]);
   }
由于CComPtr对操作符重载用法的扩展,使得代码的编译和运行无懈可击。

假定模板类知道它所操纵的指针类型,你可能会问:那为什么智能指针不能在它的功能操作符或构造函数中自动调用QueryInterface,从而更有效地包装IUnknown呢?在Visual C++ 5.0出来以前,没有办法将某个接口的GUID与它的本身的C++类型关联起来——Visual C++ 5.0用私有的declspec将某个IID与一个接口定义绑定在一起。因为ATL的设计 考虑到了它要与大量不同的C++编译器一起工作,它需要用与编译器无关的手段提供GUID。下面我们来探讨另一个类——CComQIPtr类。

CComQIPtr与CComPtr关系很密切(实际上,它只增加了两个成员函数)。CComQIPtr必须要两个模板参数:一个是被操纵的指针类型 ,另一个是对应于这个指针类型的GUID。例如,下列代码声明了操纵IDataObject 和IPersist接口的智能指针:

CComQIPtr<IDataObject, &IID_IDataObject> do;
   CComQIPtr<IPersist, &IID_IPersist> p;
  CComQIPtr的优点是它有重载的构造函数和赋值操作符。同类版本(例如,接受相同类型的接口)仅仅AddRef右边的赋值/初始化操作。这实际上就是CComPtr的功能。异类版本(接受类型不一致的接口)正确调用QueryInterface来决定是否这个对象确实支持所请求的接口:

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

Tags:ATL 建立 轻量级

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