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

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

 2006-07-21 11:44:36 来源:WEB开发网   
核心提示: void f(void) { IUnknown *rgpUnk[3]; ZeroMemory(rgpUnk, sizeof(rgpUnk)); if (FAILED(GetObject(rgpUnk))) goto cleanup; if (FAILED(GetObject(rgpUnk+

void f(void) {
  IUnknown *rgpUnk[3];
  ZeroMemory(rgpUnk, sizeof(rgpUnk));
  if (FAILED(GetObject(rgpUnk)))
   goto cleanup;
  if (FAILED(GetObject(rgpUnk+1)))
   goto cleanup;
  if (FAILED(GetObject(rgpUnk+2)))
   goto cleanup;
  UseObjects(rgpUnk[0], rgpUnk[1], rgpUnk[2]);
cleanup:
  if (rgpUnk[0]) rgpUnk[0]->Release();
  if (rgpUnk[1]) rgpUnk[1]->Release();
  if (rgpUnk[2]) rgpUnk[2]->Release();
}  
这样的代码虽然不那么专业,但至少减少了屏幕的水平滚动。

使用以上这些代码段潜在着更加棘手的问题,那就是在碰到C++异常时。如果函数UseObjects丢出异常,则释放指针的代码被完全屏蔽掉了。 解决这个问题的一个方法是使用Win32的结构化异常处理(SEH)进行终结操作:

void f(void) {
  IUnknown *rgpUnk[3];
  ZeroMemory(rgpUnk, sizeof(rgpUnk));
  __try {
  if (FAILED(GetObject(rgpUnk))) leave;
  if (FAILED(GetObject(rgpUnk+1))) leave;
  if (FAILED(GetObject(rgpUnk+2))) leave;
  UseObjects(rgpUnk[0], rgpUnk[1], rgpUnk[2]);
  } __finally {
  if (rgpUnk[0]) rgpUnk[0]->Release();
  if (rgpUnk[1]) rgpUnk[1]->Release();
  if (rgpUnk[2]) rgpUnk[2]->Release();
}
  可惜Win32 SHE在C++中的表现并不如想象得那么好。较好的方法是使用内建的C++异常处理模型,同时停止使用没有加工过的指针。标准C++库有一个类:auto_ptr,在其析构函数中定 死了一个操作指针的delete调用(即使在出现异常时也能保证调用)。与之类似,ATL有一个COM智能指针,CComPtr,它的析构函数会正确调用Release。

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

Tags:ATL 建立 轻量级

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