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. /
- 卷积与反卷积(转置卷积)关系的公式推导 及其各自的形式
- platform device和platform driver
- LruCache的终极解析
- 梯度下降法和最速下降法区别
- IIS网站安全设置
- gallery3D(3)
- Android 真正的3D Gallery
- 招商银行证书到期后不同机器恢复导致的问题——“用户密码、证件号码和证书错误#3”
- Kafka多租户(配额)管理
- Java集合(十一)TreeSet解读
- TCP的基本概念
- Windows上CLion配置和使用教程
- 聚类分析及R编程实现
- int.TryParse 方法
- DBCC 简介
- qt之QSqlQuery类执行SQL语句
- cs,ds,ss,es?即cs,ds,ss,es的区别