设为首页 加入收藏

TOP

有效的使用和设计COM智能指针――条款11(二)
2014-11-23 23:11:49 来源: 作者: 【 】 浏览:5
Tags:有效 使用 设计 COM 智能 指针 条款
而且在使用某些智能指针的时候也不会存在问题。如_com_ptr_t允许你在特异化一个智能指针的时候采用如下这种方式将IID和接口绑定起来。

view plaincopy to clipboardprint //特异化一个智能指针的时候采用如下这种方式将IID和接口绑定起来
_COM_SMARTPTR_TYPEDEF(ICalculator, IID_ICALCULATOR);
HRESULT Calculaltor()
{
ICalculatorPtr spCalculator (CLSID_CALCULATOR); //构造函数可创建COM组件
int nSum = 0;
spCalculator->Add(1, 2, &nSum);
return S_OK;

//特异化一个智能指针的时候采用如下这种方式将IID和接口绑定起来
_COM_SMARTPTR_TYPEDEF(ICalculator, IID_ICALCULATOR);
HRESULT Calculaltor()
{
ICalculatorPtr spCalculator (CLSID_CALCULATOR); //构造函数可创建COM组件
int nSum = 0;
spCalculator->Add(1, 2, &nSum);
return S_OK;


采用这种方式即便是在特异化时候,不小心将IID和对应ICalculator那么查找和修改起来也会相对于简单一点。而且智能指针一经声明,则将接口指针和IID就绑定在了一起。后续开发便不需要考虑他们之间匹配的问题。

但是如果上述接口声明和CComPtr配合使用,情况就大为不一样了。你的程序可能根本无法通过编译:

view plaincopy to clipboardprint void func(void)
{
CComPtr pCalculator = NULL;
//编译失败,提示:no GUID has been associated with this object
hrRetCode = pCalculator .CoCreateInstance(CLSID_CALCULATOR,);
assert(hrRetCode);
spCalculator->DoSomething();
}
void func(void)
{
CComPtr pCalculator = NULL;
//编译失败,提示:no GUID has been associated with this object
hrRetCode = pCalculator .CoCreateInstance(CLSID_CALCULATOR,);
assert(hrRetCode);
spCalculator->DoSomething();
}
可以看出CComPtr 和 _com_ptr_t 采用了两种不同的方式解决IID和接口的绑定问题。CComPtr需要开发人员在接口声明的时候将IID与接口绑定。而_com_ptr_t则可以根据需要决定是否使用__uuid。

因此为了兼容这两种智能指针我们需要在定义的时候使用如下这种方式:

view plaincopy to clipboardprint //使用编译器为我们提供的安全机制指定IID
interface __declspec(uuid("994D80AC-A5B1-430a-A3E9-2533100B87CE")) ICalculator :
IUnknown
{
virtual HRESULT STDMETHODCALLTYPE Add(
const int nNum1,
const int nNum2,
int *pnSum
) const = 0;

virtual HRESULT STDMETHODCALLTYPE Sub(
const int nMinuend,
const int nSubtrahend,
int *pnQuotient
) const = 0;
};
//使用编译器为我们提供的安全机制指定IID
interface __declspec(uuid("994D80AC-A5B1-430a-A3E9-2533100B87CE")) ICalculator :
IUnknown
{
virtual HRESULT STDMETHODCALLTYPE Add(
const int nNum1,
const int nNum2,
int *pnSum
) const = 0;

virtual HRESULT STDMETHODCALLTYPE Sub(
const int nMinuend,
const int nSubtrahend,
int *pnQuotient
) const = 0;
};

如果你懂得IDL,那么用IDL定义接口并将IID与其绑定会更加合理一些。但暂且让我们这样做,它会使示例想表达的东西更加明确和清晰。

是的,这样虽然移植性稍差一点,但是它使得接口使用起来更为安全和方便。你不需要在每次查询接口和创建COM组件的过程中为接口指定相应的IID。那常常是导致错误的地方。我们需要的是先考虑如何编写难以发生错误的安全代码,之后才是其兼容性。

如果你想了解如何解决uuid和__uuidof所带来的移植和兼容性的讨论。

作者“liuchang5的专栏”

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇有效的使用和设计COM智能指针――.. 下一篇有效的使用和设计COM智能指针――..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: