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. http://en.wikipedia.org/wiki/Component_Object_Model

3. http://www.microsoft.com/com/


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值