Inside COM 笔记二(Chapter3,Chapter4)

来源:互联网 发布:网络运营工作计划 编辑:程序博客网 时间:2024/04/29 22:04
首先介绍QueryInterface,可见它的地位。为什么要存在,因为COM组件对用户来说是一个黑盒子,不知道里面到底有什么,所以

就需要有查询的方法。
COM的Interface必须继承自IUnknown。每个Interface的vtbl中的前3个函数都是QuereyInterface,AddRef和Release。
IUnknown的获取,通过CreateInstance函数得到,而不必再使用new操作符。
QueryInterface的第一个参数是“接口标识符”,第二个参数是“存放请求接口指针的地址”。
Interface不能按照虚拟的方式继承IUnknown。
使用QueryInterface的一个简单例子,一目了然。
//Server
IIX : public IDispatch
{
public:
 virtual xxx() = 0;
...
}




//Client
IIX *pIx = NULL;
IUnknown* pUnknown = zzz;
HRESULT hr;
hr = pUnknown->QueryInterface(IID_IIX, (void**)&pIx);
if (SUCCEEDED(hr))
{
  pIx->xxx();
}

Chapter4 引用计数
引用计数,顾名思义。但是为什么它要存在,内存管理的一个方式。当客户从组件取得一个Interface时,此引用计数值将增1.当
客户使用完某个Interface后,组件的引用计数值将减1.当引用计数值为0时,组件即可将自己从内存中删除。当创建某个已有
Interface的另外一个引用时,用户也将会增大相应组件的引用计数值。
正确使用的规则:
1.在返回函数指针之前调用AddRef。
2.使用完Interface之后调用Release。
3.在赋值之后调用AddRef。