《COM技术内幕学习笔记》
说是学习笔记实际上是文中一些,自己觉得重要的地方的摘录。。觉得写的很不错。最近一段时间。自己接触到的一个有关COM 思想的东西。所以找了这本书来看看。顺便摘录其中的一些东西。和大家一起学习。
欢迎转载。唯一要求是请注明出处和作者。共同努力吧。
作者:苦孩子
blog地址:http://blog.csdn.net/kuhaizi
对com来说,接口是一个包含一个函数指针数组的内存结构。每一个数组元素包含的是一个由组件所实现的函数的地址。对于con而言,接口就是此内存结构,其他东西均是一个com并不关心的事先细节。
在C++中,可以使用抽象基类来实现COM接口。由于一个COM组件可以支持任意数目的接口,因此对于此类组件,我们将用抽象基类的多重继承来实现之。
实际上从一个程序员的角度来讲,接口对于一个应用程序而言是最重要的。组件本身只不过是接口的实现细节。
接口使得客户可以用同样的方式来处理不同组件。这种能力就被称作是多态。
纯抽象基类指的是仅包含纯抽象函数的基类。纯虚函数指用 = 0 标记的虚拟函数。在定义纯抽象函数的类中,是不实现这些纯虚函数的。纯虚函数将在派生类中实现。
多重继承指的是一个类直接继承了一个以上的基类。在C++中,大多数情况下人们使用的是单继承,也就是一个类只有一个基类。
可以将一个抽象类看作是一个表单。派生类所做的是填充此表单中的空白。抽象基类指定了其派生类应提供哪些函数,而派生类则具体实现这些函数。对纯虚函数的继承被称作是接口继承。这主要是因为派生类所继承的只是基类对函数的描述。抽象类并没有提供任何可供继承的实现细节。
由于com是与语言无关的,对于什么是接口,它有一个二进制的标准。也就是说,表示一个接口的内存块必须具有一定的结构。当使用纯抽象基类时,许多C++编译器将可以生成具有这种结构的内存块。
在使用M$ Win32开发工具时。
interface做为接口的定义。interface的定义在OBJBASE.H头文件中,定义如下:#define interface struct
使用struct的原因在于struct的成员将自动具有公有的属性。因此不需要另外在定义中加上public关键字。去掉public关键字可以减少一些混乱。
COM接口实现的精髓:
COM接口在C++中使用纯抽象基类实现的。
一个COM组件可以提供多个接口。
一个C++类可以使用多继承来实现一个可以提供多个接口的组件。
COM所使用的调用 标准约定
用__stdcall标记的函数将使用标准的调用约定,即这些函数将在返回到调用者之前将参数从栈中删除。Pascal函数对于栈的处理使用的也是同一种方式。在常规的C/C++调用约定中,栈的清理工作则是由调用者完成的。大多数其他编程语言。如VB缺省情况下使用的也是标准的调用约定。标准调用约定名称的由来在于所有的win32API函数。除了那些带有变参的外,使用的都是这种调用方式。带有变参的函数所用的仍然是C调用约定。即__cdecl。
Windows采用标准的调用约定的原因在于这种约定可以减少代码的大小。另外一个原因是早期的windows是运行于640KB的系统上的。
Microsoft平台上COM接口所提供的所有函数使用的均是标准的调用约定,参数数目可变的函数使用的则是C调用约定。一般人们希望接口的实现使用这些约定。但要说明的是这并不是COM的绝对需要。开发人员可以选择使用例外某些调用约定,但一定要在文档中将这一点写清楚。并且还要注意用其他语言所编写的组件可能并不能使用此接口。
同时,
pascal在WINDEF.H中定义为:
#define pascal __stdcall
在OBJBASE.H中也定义了如下的宏:
#define STDMETHODCALLTYPE __stdcall