com原理与运用 chapter 2 com对象和接口

chapter 2 com对象和接口

1,通常情况下把com对象简称为对象,把com接口简称为接口。客户程序与com组件程序进行交互的实体是com对象。

2,记住这个结构
typedef struct _GUID {
DWORD data1;         //           32 位
WORD data2;            //           16 位
WORD data3;            //           16 位
BYTE data4[8];          //8*8 = 64 位
}GUID;                   + _____________
                                                128 位

3,com对象与c++对象的区别
a,com对象的数据成员是以组件为边界的,对于客户是不可见的;c++对象的封装是语义上的,对于客户是可见的。
b,com的重用性是动态的,对象a重用对象b,当对象b增强了功能时,对象a自动使用新版本b,而且根本不需要重新编译或者重新设置;c++的重用性体现在继承,类a从类b派生,当类b作了修改时,类a必须重新编译或者修改相应的代码。

4,com接口,com规范的核心内容
接口,是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组建对象的功能。

           系统边界
        客户   |   组件
                   |      vtable     对象实现
                   |    
接口指针 -->  pVtable -->  指针函数1  -->  实现接口函数1
                   |                           指针函数2  -->  实现接口函数2
                   |                                    ...        -->  ...

                   com接口二进制结构

a,通常把接口函数称为虚函数表(virtual function table,简称vtable),指向vtalbe的指针为pVtable,从上图可以看出,客户只是获得了接口指针,组件也仅暴露了pVtable。
b,com接口与对象是如何联系的?通过this指针,每个成员函数的第一个参数是指向接口自身的this指针。

5,com接口描述语言
com规范在采用osf的dce规范描述远程调用接口idl(interface description language,接口描述语言)的基础上,进行扩展形成了com接口描述语言。接口描述语言提供了一种不依赖任何语言的接口描述方法,因此,它可以成为组件程序和客户程序之间的共同语言。

6,接口的一些特点
a,接口规范建立在二进制标准上,任何只要有能力描述接口的语言就可以用于组件程序的开发。而c++的class可以以最简洁的方式描述com接口,而且用class隐藏了接口的虚函数表以及接口成员函数的this指针参数,使得接口定义容易理解。
b,设计接口时应该,要考虑组件对象提供功能的一般特性,以是接口更为通用,更为稳定。
c,com规范,所有的接口都必须从IUnknown派生(直接或者间接),很多接口的名字的最后字母是2或者Ex,表明它是一个继承接口。

7,IUnknown接口
a,IUnknown提供了两个非常重要的特性:生存期控制和接口查询
b,每个com对象都记录了一个称为“引用计数”的数值,该数值的含义是有多少个有效指针在引用该com对象,如果该计数的数值为0,com对象就应该把自己从内存中清除。
c,实现引用计数的分为几个层次
 组件一级上实现引用计数(计数分辨率太粗),可以选择全局变量来实现。
 对象一级上实现引用计数(比较合理),可以选择类成员变量来实现。
 接口一级上实现引用计数(计数分辨率太细,但是对于调试组件程序和分析客户程序的使用情况非常有帮助),可以为对象的每个接口设置一个成员变量来实现。
d,引用计数可以防止两方面的问题:当使用一个接口指针变量时,发现它所指的com对象已经不存在了;当使用完了com对象后,对象并不被清除。对于前者,可能是忘了调用AddRef,导致程序出错;对于后者,可能是忘了调用Release,导致资源不释放,这时如果采用接口一级的引用计数则可以跟踪到哪个接口指针忘了释放。
e,接口查询QueryInterface([in]REFIID iid, [out] void**ppv);一个com对象可以实现多个接口,客户程序可以在运行时刻对com对象的接口进行查询,如果对象实现了该接口,则对象可以提供这样的服务,否则,对象可以拒绝提供这样的服务。QueryInterface返回以下三个值
 S_OK,查到了指定的接口,接口指针存放在ppv中。
 E_NOINTERFACE,对象不支持所指定的接口,*ppv = NULL
 E_UNEXPECTED,发生了意外错误,*ppv = NULL

8,com对象的接口原则
a,对于同一个对象的不同接口指针,查询的IUnknown必须完全相同。因此可以通过查询得到的IUnknown来判断是否指向同一个对象,如果查询的不是IUnknown接口,可以允许不一样,这就允许对象在必要的时候生成接口指针。
b,接口对称性,对一个接口查询其自身总应该成功(S_OK)。
c,接口自反性。如果接口指针a能成功查询到接口指针b,那么接口指针b必定能够查询到接口指针a。
d,接口传递性。如果接口指针a能成功查询到接口指针b,接口指针b能成功查询到接口指针c,那么接口指针a就能成功查询到接口针c。
e,接口查询时间无关性。如果在某一时刻可以查询到某一个接口指针,则以后任何时候查询同样的接口,一定成功。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值