COM原理(一)

来源:互联网 发布:人工智能要那些专业 编辑:程序博客网 时间:2024/04/28 18:08
  COM(Component Object Model)--组建对象模型。是一种以组件为发布单元的对象模型,这种模型是各个软件组件可以以一种统一的方式进行交互。COM既提供了组件之间进行交互的规范,也提供了实现交互的环境,因为组件对象间交互的规范不依赖于任何特定的语言,所以COM也可以使不同语言协作开发的一种标准。

    OLE(Object Linking and Embedding)--对象连接和嵌入
    DDE(Dynamic Data Exchange)--动态数据交换

    组件软件,是指按组建模型组合而得到的软件。 
    软件组件,是指构成组建软件的每个组建。

    COM不仅提供了组件之间的接口标准,还引入了面向对象思想。在COM标准中,对象是一个非常活跃的元素,经常称为COM对象。组件模块为COM对象提供了活动的空间,COM对象以接口的方式提供服务,这种接口成为COM接口。

    在Windows系统平台上,一个COM组件或者是一个DDL(Dynamic Linking Library),或者是一个EXE文件。一个组件程序可以包含多个COM对象,并且每个COM对象可以实现多个接口。当另外的组件或者普通程序(即组件的客户程序)调用组件的功能时,他首先创建一个COM对象或者通过其他途径获得COM对象,然后通过该对象所实现的COM接口调用他所提供的服务。当所有服务结束后,如果客户程序不再需要该COM对象,那么他应该释放掉对象所占用资源,包括对象自身。
    大多数的COM组件只包括一个COM对象。


一、 COM结构

COM标准包括规范和实现两大部分,规范部分定义了组件和组件之间通信的机制,这些规范不依赖与任何特定的语言和操作系统,只按照该规范,任何语言都可以使用;实现部分是COM库,COM库为COM规范的实体实现提供了一些核心服务。

1  对象和接口



COM是面向对象软件模型,因而对象是他的基本要素之一。类似于C++中对象的概念,对象是某个Class的一个实体,而类则是一组相关数据和功能组合在一起的一个定义。使用对象的应用成为客户。

接口一组逻辑上相关的函数集合,其函数也被成为接口成员函数。接口名常用“ I ”为前缀,如“IUnknown”。对象通过接口成员函数为客户提供各种服务。

在COM模型中,对象本身对客户来说是不可见,客户要求服务时,只能通过接口进行。每个接口都由128位的全局唯一标识符(GUID,Globally Unique Identifier)来标识。客户通过GUID获得接口的指针,再通过接口指针,客户就可以调用其相应的成员函数。具体的实现完全由对象的接口内部实现。所以在COM模型中,对象通过接口及接口中的函数为客户提供服务,对客户来说,他只于接口打交到。

一般来说,接口是不变的,只要客户希望的接口在组件对象中还存在,他就可以继续使用该接口所提供的服务。对象可以支持多接口,因此对组件对象的升级可通过增加接口的办法来实现,这样新的接口不影响老的接口使用。新用户可以使用新的接口,老用户在不更新代码的情况下继续使用老接口

客户如何来识别每个COM对象?,与接口相似,每个对象也用一个128位GUID来识别,称为CLSID(Class Identifier,类标识符)。用CLSID标识的对象可保证意义上全球范围的唯一性。只要系统中含有这类COM对象的信息,并包括COM对象所在的模块文件以及COM对象在代码中的入口点。客户程序就可以通过CLSID来创建COM对象。

客户 怎么使用COM对象提供的服务?客户获得又是什么? 实际上,客户成功创建对象后,他得到的是一个指向对象某个接口的指针,因为COM对象至少实现一个接口(没有接口的COM对象没有意义),所以客户就可以调用该接口提供的所以服务。

COM规范,一个COM对象如果实现了多个接口,则可以从某个接口得到该对象的任何其他接口。

从这个过程中可以看出,客户与COM对象只通过接口打交道,对象对于客户来说只是一组接口。

COM对象有其自己的状态,正是这种状态才使得客户感觉到COM对象的存在,如果客户同时拥有两个CLSID对象,则两个对象可以有不同的状态,客户完全不必关心COM对象是如何实现的,以及这两个对象的状态数据结构之间的关系。当然,COM对象也可以是无状态的,这种COM对象以提供服务为主,可以用来代替传统的API。


2  客户/ 服务器模型

COM不仅是一种简单的客户/服务器模型,有时客户也可以反过来提供服务,或者服务方本身也需要其他对象的一些功能,这种情况下,一个对象可能即使服务器也是客户。

客户/服务器模型的优势:
1)稳定性,可靠性好。 简化了应用,把任务进行分离,客户和服务器各司其职,共同完成任务。
2)软件的可扩展性好。一个服务器进程可以为多个客户提供服务,客户也可以连接到不同的服务器上。
3)提高性能。根据硬件配置,可以把繁重的任务放到高配置端,低配置的设备完成一些简单的任务。
4)在网络上实现时,可以降低网络流量。网络上直传输客户和服务关心的数据。
5)用于数据库时,可以实现事物机制,提供数据备份功能

3  COM库

COM本身除了规范之外,也有实现的部分,其包括一些核心的系统级代码部分,这部分使得对象和客户之间可通过接口在二进制代码级进行交互。

在Windows环境中,这些库以ddl形式存在:

1)提供了少量的API函数实现客户和服务器端COM应用的创建过程。在客户端主要是一些创建函数,在服务器端,提供一些对对象的访问支持。
2)COM通过注册表查找本地服务器,即EXE程序,以及程序名于CLSID的转换。
3)提供了一种标准内存控制方法,使应用控制进程中内存的分配。

COM库一般不在应用程序层实现,而在操作系统层上实现,因此一个操作系统只有一个COM库实现。COM库的实现必须依赖于具体的系统平台,尤其是系统底层的一些标准。

COM库可以保证所有的组件按照统一的方式进行交互操作,而且他使我们编写COM应用时,可以不用编写为进行COM通信而必须的大量基础代码,而是直接利用COM库提供的API进行编程,从而大大的加快了开发速度。

4 COM 三大特性


1)语言无关性  COM对象把OOP语言中的对象封装起来,并提供一直接口,使得他可以被各种不同的语言所使用。
2)进程透明性  
3)可重用性
原创粉丝点击