第1章 概述
COM组件可以是一个Dll(进程内组件),也可以是一个EXE(进程外组件)。进程内组件就是组件和客户程序在同一进程内,进程外组件即组件和客户程序分别有自己的进程空间。
一个COM组件可以包含多个COM对象,一个COM对象又可以有多个接口。
第2章 COM对象和接口
2.1 CLSID和IID
对于COM对象来说,接口是它与外界进行交互的唯一途径。
每个COM对象,可以用CLSID来标识,COM对象的每个接口可以用IID来标识。CLSID和IID都是128位的标识符GUID,是一个随机数,可以由两方面特性来保证:空间(如网络适配器地址)和时间。
GUID可以通过COM库的API函数生成:
HRESULT CoCreateGuid( GUID * pguid );
2.1.2 COM对象和C++对象的不同
COM对象的数据成员封装以组建模块为最终边界,对于对象用户是完全透明的、不可见的,用户必须通过接口方法来访问数据成员;C++对象的封装特性只是语义上的,用户可以直接看到数据成员。
2.2 COM接口结构
接口是包含了一组函数的数据结构。客户程序利用这些函数获得组件对象的服务。接口成员函数中的字符串变量必须使用Unicode字符指针。
客户程序用一个指向接口数据结构的指针来调用接口成员函数,接口指针又指向pVtable(指向vtable的指针),pVtable指向一组函数,称为接口函数表(虚函数表vtable),表中每一项为4个字节长的函数指针,每个函数指针再指向函数的具体实现。
2.2.2 接口描述语言IDL
2.3 IUnknown接口
COM定义的每个接口都必须从IUnknown接口继承过来,因为IUnknown接口提供了两个重要特性:生存期控制和接口查询。
2.3.1 使用引用计数规则
(1)函数的参数中使用接口指针变量。
输入参数:在被调用函数中,不必调用AddRef和Release函数。
输出函数:在被调用函数返回之前,对输出参数调用AddRef,增加引用计数。
输入-输出参数:在参数被修改之前,对原来传进来的接口指针调用Release,引用计数减1,在参数被修改之后,对新的接口指针变量指针调用AddRef,若在函数执行过程中,参数没有被修改,则不必调用AddRef和Release函数。
(2)局部接口指针变量。
此文章来自于【http://blog.sina.com.cn/s/blog_5698c05f0100lp1t.html】