COM原理

编码约定

在所有的前面都加有一个字母I, 如:IX表示的“接口X”。

而在类名称的前面所加的前缀则为C, 如CA表示“类A”。

Microsoft Win32软件开发工具(SDK)中OBJBASE.H头文件的定义:#define interface struct

使用struct的原因在于struct的成员将自动具有我公有的属性,因此不需要另外定义中加上public关键字。

 

标准调用

Microsoft平台上COM接口所提供的所有函数使用的均是标准的调用约定.参数数目可变的函数使用的则是C调用约定.一般人们希望接口的实现使用这些约定.但要说明的是这并不是COM的绝对需要.

在WINDEF.H中pascal的定义如下:

#define pascal __stdcall

如果读者认为将pascal这个词放在代码中会让人莫名其妙,那么可以使用OBJBASE.H中所定义的如下宏:

#define STDMEFHODCALLTYPE __stdcall

 

类并非组件

用C++开发组件时不一定非用类不可。组件也可以用C来实现。一个组也可以由多个类来实现。

 

接口并非总是继承的

COM没有要求实现某个接口的类必须从那个接口继承,这是客户并不需要了解COM组件的继承关系。对接口的继承只不过是一种实现细节而已。

 

多重接口及多重继承

一个接口是一个函数集合,一个组件则是一个接口集,而一个系统则是一系列组件的集合。

 

接口不变性

一旦分布了一个接口,那么它将永远保持不变。当对组件进行升级时,一般不会修改已有的接口,面是加入一些新接口。

命名冲突

对于一个支持多个接口的组件,接口函数的名字出现冲突是经常会遇到的。这些种情况下,改变某个发生冲突的函数名称即可。COM对此不关心。COM接口是一个二进制标准,客户同接口的连接并不是通过其名称或其成员函数的名称完成的,而是通过它在表示它的内存块的位完成的。

解决命名冲突的另外一种 方法是不使用多重继承

实现组件的类并不需要继承每一个接口,而可以使用指向实现某些接口的类的指针。

接口名称之间出现冲突的情况也是可能的。如果在接口和函数名称的前面加上公司名称或产品名称可以减少此种 可能性。

多态

多态指的是可以按同一种方式来处理不同的对象。若两个不同的组件支持同一接口,那么客户将可以使用相同的代码一处理其中的任何一个组件。就是说,客户可以按照相同的方式来处理不同的组件。

虚拟函数表

当定义一个纯抽象类时,所定义的实际上是一个内存块的结构.纯抽象类所有实现都是一些具有相同的基本结构的内存.


所有的COM接口都继承了IUnknown,每个接口的vtbl中的前三个函数都是QueryInterfaceAddRefRelease

Interface IUnknown

{

            virtual HRESULT __stdcall QueryInterfaceREFIID riid, void ** ppvObject) = 0;

            virtual ULONG __stdcall  AddRefvoid) = 0;

            virtual ULONG __stdcall 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值