COM原理笔记

COM 原理笔记之一 —— 概述篇

COM (组件对象模型, Compent Object Model )是 Microsoft 提出来的组件标准,它不仅定义了组件程序之间进行交互的标准,并且也提供了组件程序进行所需要的环境。

一、两种进程模型:

进程内组件:以动态链接库的形式出现( .dll );

进程外组件:以可执行程序的形式出现( .exe );

进程内模型的优点是效率高,但组件不稳定会引起客户进程崩溃,因此组件可能会危及客户。

进程外模型的优点是稳定性好,组件进程不会危及客户程序,但效率相对较低。

二、组件软件与软件组织:

组件软件:是指按组件模型组合而得到的软件。

软件组织:是指构成组件软件的每个组件。

三、对象与接口:

对象是某个类( Class )的一个实例,而类则是一组相关的数据和功能组合在一起的定义。每个对象用一个 128 GUID 来标识,称为 CLSID class indentifer )类标识符或类 ID

接口是一组逻辑上相关的函数集合,其函数也称为接口成员函数。每个接口用 128 位的全局唯一标识符( Globally Unique Identifier )来标识接口。

四、 COM 特性

1 、语言无关性:

COM 规范的定义不依赖于特定的语言,它所采用的是一种二进制代码级标准,而不是源代码级标准。

2 、进程透明性:

COM 库负责组件程序的定位,管理组件对象的创建和对象与客户之间通信,对用户来讲这是透明的。

3 、可重用性:两种机制实现对象的重用

包容方式:对象 1 包含对象 2 ,当对象 1 需要用到对象 2 的功能时,它可以简单地把实现交给对象 2 来完成。虽然对象 1 和对象 2 支持同样的接口,但对象 1 在实现接口时实现调用了对象 2 的实现。

聚合方式:对象 1 只需要简单地把对象 2 的接口递交给客户即可,对象 1 并没有实现对象 2 的接口,但它把对象 2 的接口也暴露给客户程序,而客户程序并不知道内部对象 2 的存在。

COM 原理笔记之二—— COM 对象与接口

 

一、             COM 对象与 C++ 对象的比较:

1、   封装性:

COM 对象的数据成员的封装以组件模块为最终边界,对于对象用户完全是透明的。客户只能通过接口成员函数访问对象的属性。

虽然《 COM 原理》指出 C++ 对象的封装特性只是语义上的封装,对于对象用户是可见的。但是从封装性必须满足以下条件(有一个清晰的边界,有确定的接口,受保护的内部实现)来考虑,我个人认为两者之间并没有太多的区别,只是表现形式上的不同而已。

2、   可重用性:

COM 对象的可重用必表现在 COM 对象的包容与聚合,一个对象可以完全使用另一个对象的所有功能;

C++ 对象的可重用性主要体现在继承性机制上,继承性机制使得 C++ 子类不仅可以重用其父类的数据结构与程序代码,而且可在父类代码的基础方便地上进行修改与扩充,同时并不影响其对原有类的使用。

3、   多态性:

COM 对象的多态性通过其所具有的接口才能体现出来。

C++ 对象通过虚函数与重载来体现。

二、             COM 接口具有的一些特性:

1、   二进制特性:

接口规范并不建立在任何编程语言的基础上,而是规定了二进制一级的标准。任何语言只要有足够的数据表达能力,就可以对接口进行描述,从而可以用于与组件程序有关的应用开发。

2、   接口不变性:

接口是组件客户程序和组件对象之间的桥梁,接口如果经常发生变化,则客户程序和组件程序也要跟着变化,这对应用系统的开发非常不利,也不符合组件化程序设计的思想。

3、   继承性(扩展性)

根据 COM 规范,所有接口都必须从 IUnknown 派生,可以是直接派生,也可以是间接派生。 COM 不提倡接口继承,同时接口与接口之间的继承也只能是单继承。

4、   多态性:

运行过程中的多态性。前面说 COM 对象的多态性通过 COM 接口来体现,我们常常可以注意到多个不同的 COM 对象实现了同一个接口,客户程序通过代码便可以调用 COM 对象。

三、             COM 对象的接口原则:

1、    对于同一个对象的不同接口指针,查询得到的 Iunknow 接口必须完全相同。

2、    接口对称性:对一个接口查询其自身总应该成功。

3、    接口自反性:如果从一个接口指针查询到另一个接口指针,则从第二个接口指针再回到第一个接口指针必定成功。

4、    接口传递性:如果从第一个接口指针查询到第二个接口指针,从第二个接口指针可以查询到第三个接口指针,则从第一个接口指针一定可以查询到第三个接口指针。

5、    接口查询时间无关性:如果在某一个时刻可以查询到某一个接口指针,则以后任何时候查询同样的接口指针,一定可以查询成功。


posted @ 2009-07-27 14:39  dzqabc  阅读(828)  评论(0编辑  收藏  举报