《COM技术内幕学习笔记》

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的绝对需要。开发人员可以选择使用例外某些调用约定,但一定要在文档中将这一点写清楚。并且还要注意用其他语言所编写的组件可能并不能使用此接口。

同时,

pascalWINDEF.H中定义为:

#define  pascal  __stdcall

OBJBASE.H中也定义了如下的宏:

#define  STDMETHODCALLTYPE  __stdcall

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值