Component Object Model (COM)

时间: 2023-07-09 admin IT培训

Component Object Model (COM)

Component Object Model (COM)

[简介]

COM是什么?COM怎么来的?为什么要有COM?COM是怎么工作的?COM组件,COM对象,COM接口关系?

COM (Component Object Model, 组件对象模型) 是一种以组件为发布单元的对象模型,这种模型使各软件组件可以用一种统一的方式进行交互。

先于COM出现的是一种叫做OLE(Object Linking and Embedding,对象链接和嵌入)的技术,用来支持复合文档的概念,在最初的OLE 1.0中,并没有使用COM规范在组件程序和客户程序之间进行通信,而是使用DDE(Dynamic Data Exchange,动态数据交换)的机制,DDE建立在Windows操作系统的消息交换机制上,最大的缺点是效率低,而且稳定性不好,使用也不够方便。到了OLE 2.0中,采用了新的COM模型,OLE 2.0是第一个采用COM架构的软件系统。

在Windows系统中,一个COM组件是一个DLL或者EXE的文件。一个组件程序可以包含多个COM对象,并且每个对象可以实现多个COM接口。

接口是一组逻辑上相关的函数集合,其函数也被称为接口成员函数。每一个接口由一个128位的全局唯一标识符(GUID)来标识。客户通过GUID获得接口的指针,再通过接口指针,用户就可以调用其相应的成员函数。每一个对象也是由128位的GUID标识,称为CLSID(Class Identifier),客户程序可以由GLSID创建COM对象,得到一个指向对象某个接口的指针,因为COM对象至少实现一个接口,所以客户就可以调用该接口提供的所有服务,而且可以从该接口得到该对象的其他任意接口。

COM除了本身的规范外,还包括一些核心的系统级代码实现,这些库以DLL文件形式存在,用以:提供少量的API函数实现客户和服务器端COM应用的创建过程;通过注册表查找本地服务器即EXE程序,以及程序名与CLSID的转换;提供了一种标准的内存控制方法。

COM的特性:语言无关性,因为采用的是二进制代码级的标准(而不是源码级);进程透明性,进程内、本地或远程对于客户程序是透明的;可重用性,可以包容和聚合。

[COM对象和接口]

除了COM接口外,还可以采用平面型API接口的方式将两个程序连接起来,问题是:
(1) 当API函数非常多时,使用不方便,不好组织。
(2) API函数需要标准化,按照统一的调用方式进行,以适应不同的语言编程实现,如参数的传递顺序、参数类型、函数返回处理都需要标准化。

COM规范采用的是__stdcall调用习惯,由被调函数清理参数堆栈。如果一个客户程序要使用一个COM对象的某个接口,它必须知道这个接口的IID(Interface Identifier)和接口所能提供的方法(即接口成员函数)。

接口描述语言 IDL (Interface Description Language)是一种不依赖于任何语言的接口描述方法,它可以成为组件程序和客户程序之间的共同语言。MS Visual C++提供MIDL工具可把IDL文件编译成C/C++兼容的接口描述头文件(.h)。

类继承不仅是说明继承,也是实现继承。而接口继承只是说明继承,而且接口继承只允许单继承。根据COM规范,所有的接口必须从IUnknown派生。

  <IUnknown接口>

COM定义的每一个接口都必须从IUnknown继承过来,因为IUnknown接口提供了两个非常重要的特性:生存期控制和接口查询。

interface IUnknown
{
  HRESULT QueryInterface([in] REFIID iid, [out] void * * ppv);
  ULONG Addref(void);
  ULONG Release(void);
}

引用计数在对象一级会比较合适,在组件一级计数分辨率太粗,而在接口一级则计数分辨率太细。

[COM的实现]


[COM的特性]


[参考]


1. COM原理与应用.

2.

3. /