有效的使用和设计COM智能指针 ——条款5:了解_com_ptr_t 设计背后的历史原因

本文介绍了微软专有模板类_com_ptr_t在封装COM接口操作中的作用,包括如何使用_COM_SMARTPTR_TYPEDEF宏定义特异化版本,以及_com_ptr_t如何简化引用计数和接口查询。文章还探讨了_com_ptr_t与VB、Delphi等语言中操作COM接口的相似性,以及#import预处理命令在导入类型库时的作用。
摘要由CSDN通过智能技术生成

条款5:了解_com_ptr_t 设计背后的历史原因

更多条款请前往原文出处:http://blog.csdn.net/liuchang5

_com_ptr_t是微软在VC中的一个专有模版类。它封装了对IUnknownQueryInterface()AddRef()Release()的操作,并提供自己的一些成员函数从而对COM接口指针进行操作。同时_com_ptr_t还简化了COM接口对引用计数的操作以及不同接口间的查询操作。

要使用_com_ptr_t这个智能指针,首先需要用_COM_SMARTPTR_TYPEDEF这个宏来声明特异化(Specialization)版本的_com_ptr_t 类别。之后则可以使用形如“接口名称+Ptr”这样的名称来定义此种接口类型的智能指针。例如:

_COM_SMARTPTR_TYPEDEF(ICalculator, __uuidof(ICalculator));
_COM_SMARTPTR_TYPEDEF(ICOMDebugger,__uuidof(ICOMDebugger));
HRESULT Calculaltor()
{
    ICOMDebuggerPtr spDebugger = NULL;
    ICalculatorPtr  spCalculator (CLSID_CALCULATOR); //构造函数可创建COM组件
    int nSum = 0;
    spCalculator->Add(1, 2, &nSum);
        
    spDebugger = spCalculator;    //自动调用QueryInterface查询所需要的接口
    spDebugger->GetRefCount();
    
return S_OK;
}//无需手动调用Release(),接口会在智能指针析构时自动调用Release()。


_COM_SMARTPTR_TYPEDEF这个宏,一般放置于单独的头文件中。这样,只要include了此头文件的相关文件,都能使用名称为“接口名+Ptr”这种类型的智能指针。

这使得_com_ptr_t这套智能指针使用起来相对比较简单,编写代码时不存在一大堆针对模版的类型参数化过程。使用者也感觉不到模版的存在,用类似接口指针的方式即可使用此智能指针。

如果想探究_com_ptr_t这套智能指针的特异化过程是如何完成的,我们可以将特异化时候所用到的_COM_SMARTPTR_TYPEDEF这个宏展开:

typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)>> IMyInterfacePtr;

其中_com_IIID 的原型为:

template<typename _Interface, const IID* _IID /*= &__uuidof(_Interface)*/> 
class _com_IIID 

可以看出_com_IID这个类模版的功能是对IID和具体的类型进行封装,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值