COM接口
*客户获得接口指针,接口指针指向pVtable,pVtable指向vtable(虚函数表,每项4B的函数指针),函数指针指向对象实现。
*COM接口结构中的vtable与C++ class的虚函数表完全一致,所以,用C++的class来描述COM接口是最方便的手段。
*COM提供一种不依赖于任何语言的接口描述方法:IDL。IDL文件通过MIDL工具可编译为h头文件,可以被组件实现程序和客户程序引用。
COM接口的内存模型
*IDictionary的实现CDictionary,有两个对象CD1和CD2,内存结构中CD1和CD2有单独的(pVtable、Data、Property),但共用vtable和具体实现代码。
*IDictionary的实现CDictionary和CDictionary2,CDictionary对象CD1,CDictionary2对象CD2,内存结构中CD1和CD2有单独的(pVtable、Data、Property,以及vtable和具体实现代码)。
IUnknown
*IUnknown主要作用:生存期控制(引用计数)和接口查询。
*使用引用计数规则:(1)函数的参数中使用接口指针变量,输入参数不调用AddRef和Release,输出参数调用AddRef加1,输入输出参数不调用 AddRef和Release;(2)局部 接口指针 变量, 不调用AddRef和Release;(3)全局,传入前调AddRef,返回后调Release。
*注意COM对象实现多个接口时的内存结构,以及QI的具体实现。(参见P44-45,另注意P47的C++实现CDictionary中IUnknown的实现)