用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+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) {
可惜Win32 SHE在C++中的表现并不如想象得那么好。较好的方法是使用内建的C++异常处理模型,同时停止使用没有加工过的指针。标准C++库有一个类:auto_ptr,在其析构函数中定 死了一个操作指针的delete调用(即使在出现异常时也能保证调用)。与之类似,ATL有一个COM智能指针,CComPtr,它的析构函数会正确调用Release。
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();
}
- ››建立唯美图片特效,十个jQuery插件分享
- ››建立自己的TextView和ImageView的组合View类
- ››轻量级数据交换格式 JSON轻松入门
- ››建立虚拟专用网 使用SSH保护网络通信
- ››轻量级系统 Lubuntu 10.04 发布
- ››建立一个 Derby 日历,第 3 部分: 使用事务和锁定...
- ››建立一个 Derby 日历,第 3 部分: 使用事务和锁定...
- ››建立一个 Derby 日历,第 1 部分: 理解 JDBC
- ››建立一个 Derby 日历,第 2 部分: 嵌入选项(上)...
- ››建立一个 Derby 日历,第 2 部分: 嵌入选项(下)...
- ››建立 qt for symbian 的开发环境
- ››建立一个 Android 项目的实例
更多精彩
赞助商链接