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

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

 2006-07-21 11:44:36 来源:WEB开发网   
核心提示: CComPtr类实现客户端基本的COM引用计数模型,CComPtr有一个数据成员,用ATL建立轻量级的COM对象(2)(3),它是一个未经过任何加工的COM接口指针,其类型被作为模板参数传递:CComPtr<IUnknown> unk;CComPtr<IClassFact

CComPtr类实现客户端基本的COM引用计数模型。CComPtr有一个数据成员,它是一个未经过任何加工的COM接口指针。其类型被作为模板参数传递:

CComPtr<IUnknown> unk;
   CComPtr<IClassFactory> cf;
  缺省的构造函数将这个原始指针数据成员初始化为NULL。智能指针也有构造函数,它的参数要么是原始指针,要么是相同类型的智能参数。不论哪种情况,智能指针都调用AddRef控制引用。CComPtr的赋值操作符 既可以处理原始指针,也可以处理智能指针,并且在调用新分配指针的AddRef之前自动释放保存的指针。最重要的是,CComPtr的析构函数释放保存的接口(如果非空)。请看下列代码:

void f(IUnknown *pUnk1, IUnknown *pUnk2) {
  // 如果非空,构造函数调用pUnk1的AddRef
  CComPtr unk1(pUnk1);
  // 如果非空,构造函数调用unk1.p的AddRef
  CComPtr unk2 = unk1;
  // 如果非空,operator= 调用unk1.p的Release并且
  //如果非空,调用unk2.p的AddRef
  unk1 = unk2;
  //如果非空,析构函数释放unk1 和 unk2
}
  除了正确实现COM的AddRef 和 Release规则之外,CComPtr还允许实现原始和智能指针的透明操作,参见附表二所示。也就是说下面的代码按照你所想象的方式运行:

void f(IUnknown *pUnkCO) {
  
  CComPtr cf;
  
  HRESULT hr;
  
  // 使用操作符 & 获得对 &cf.p 的存取
  hr = pUnkCO->QueryInterface(IID_IClassFactory,(void**)&cf);
  if (FAILED(hr)) throw hr;
  
  CComPtr unk;
  
  // 操作符 -> 获得对cf.p的存取
  // 操作符 & 获得对 &unk.p的存取
  hr = cf->CreateInstance(0, IID_IUnknown, (void**)&unk);
  
  if (FAILED(hr)) throw hr;
  
  // 操作符 IUnknown * 返回 unk.p
  UseObject(unk);
  
  // 析构函数释放unk.p 和 cf.p
}
  除了缺乏对Release的显式调用外,这段代码像是纯粹的COM代码。有了CComPtr类的武装,前面所遇到的麻烦问题顿时变得简单了:

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

Tags:ATL 建立 轻量级

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