用ATL建立轻量级的COM对象(2)
2006-07-21 11:44:36 来源:WEB开发网void f(IPersist *pPersist) {
在第二种赋值语句中,因为pPersist是非IDataObject *类型,但它是派生于IUnknown的接口指针,CComQIPtr通过pPersist调用QueryInterface来试图获得这个对象的IDataObject接口指针。如果QueryInterface调用成功,则此智能指针将含有作为结果的原始IDataObject指针。如果QueryInterface调用失败,则do.p将被置为null。如果QueryInterface返回的HRESULT值很重要,但又没有办法从赋值操作获得其值时,则必须显式调用QueryInterface。
CComQIPtr<IPersist, &IID_IPersist> p;
// 同类赋值 - AddRef''s
p = pPersist;
CComQIPtr<IDataObject, &IID_IDataObject> do;
// 异类赋值 - QueryInterface''s
do = pPersist;
}
既然有了CComQIPtr,那为什么还要CComPtr呢?由几个理由:首先,ATL最初的发布版本只支持CComPtr,所以它就一直合法地保留下来了。其二(也是最重要的理由),由于重载的构造函数和赋值操作,对IUnknown使用CComQIPtr是非法的。因为所有COM接口的类型定义都必须与IUnknown兼容。
CComPtr<IUnknown> unk;
从功能上将它等同于 CComQIPtr<IUnknown, &IID_IUnknown> unk;
前者正确。后者是错误的用法。如果你这样写了,C++编译器将提醒你改正。
将CComPtr作为首选的另外一个理由可能是一些开发人员相信静悄悄地调用QueryInterface,没有警告,削弱了C++系统的类型。毕竟,C++在没有进行强制类型转换的情况下不允许对类型不一致的原始指针 进行赋值操作,所以为什么要用智能指针的道理也在这,幸运的是开发人员可以选择最能满足需要的指针类型。
- ››建立唯美图片特效,十个jQuery插件分享
- ››建立自己的TextView和ImageView的组合View类
- ››轻量级数据交换格式 JSON轻松入门
- ››建立虚拟专用网 使用SSH保护网络通信
- ››轻量级系统 Lubuntu 10.04 发布
- ››建立一个 Derby 日历,第 3 部分: 使用事务和锁定...
- ››建立一个 Derby 日历,第 3 部分: 使用事务和锁定...
- ››建立一个 Derby 日历,第 1 部分: 理解 JDBC
- ››建立一个 Derby 日历,第 2 部分: 嵌入选项(上)...
- ››建立一个 Derby 日历,第 2 部分: 嵌入选项(下)...
- ››建立 qt for symbian 的开发环境
- ››建立一个 Android 项目的实例
更多精彩
赞助商链接