前段时间,大致学习了一下COM原理,对COM有个大概的了解,由于缺乏实践,时间长久也便忘得只剩一二。现在又有空闲,重新学习一下,顺便做些资料整理,备忘。(补充:学习书籍为《COM 原理与应用》购于林大旧书摊,10元值!)
COM,即组件对象模型,是一种以组件为发布单元的对象模型,这种模型使各软件组件可以用一种统一的方式进行交互。
COM不仅仅提供了组件之间的接口标准,它还引入面向对象的思想。在Windows系统平台上,一个COM组件或者是一个DLL文件,或者是一个EXE文件。一个组件程序可以包含多个COM对象,并且每个对象可以实现多个接口。当另外的组件或普通程序(即组件的客户程序)调用组件的功能时,它首先创建一个COM对象或者通过其他途径获得COM对象,然后通过该对象所实现的COM接口调用它所提供的服务。当所有的服务结束后,如果客户程序不再需要该COM对象,那么它应该释放掉对象所占有的资源,包括对象自身。
对象与接口
COM是面向对象的软件模型,因而对象是它的基本要素之一。对象是某个类的一个实例;而类则是一组相关的数据和功能组合在一起的一个定义。使用对象的应用称为客户。
接口是一组逻辑上相关的函数组合,其函数也被称为接口成员函数。按照习惯,接口名常以“I”为前缀。对象通过接口成员函数为客户提供各种形式的服务。
一个COM对象如果实现了多个接口,则可以从某个接口得到该对象的任意其他接口。
客户/服务器模型
对象和客户之间的相互作用是建立在客户/服务器模型的基础上的,客户/服务器模型的一个很大的优点是稳定性好,而稳定性正是COM模型的目标,尤其对于跨进程的程序通信,稳定性更会带来性能上的高可靠性。
客户/服务器模型是一种发展比较成功的软件模型,因为这种模型有以下一些优势:
① 稳定性、可靠性好。客户/服务器模型简化了应用,把任务进行分离,客户和服务各司其职,共同完成任务。
② 软件的可扩展性更好。一个服务器进程可以为多个客户提供服务,客户也可以连接到不同的服务器上。
③ 提高性能。根据硬件的配置,可以把繁重的任务放到高配置的一端,用低配置的设备完成一些简单的任务。
④ 在网络上实现时,可以降低网络流量。在网络上只传输客户和服务器程序所关心的数据。(如何确定哪些是关心的数据不明白)
⑤ 用于数据库时,可以实现事务机制,提供数据备份能力等。(这个就更不明白了,看来得了解下数据备份的原理才行)
COM中两种对象的重用机构,分别称为包容和聚合。区别在后面进行重点分析。
COM库
COM本身除了规范外,也有实现的部分,其中包括一些核心的系统级代码,也正是这部分的核心代码,才使得对象和客户之间可通过接口在二进制代码级进行交互。
在Microsoft Windows操作系统环境下,这些库以.dll文件的形式存在,其中包括以下内容:
① 提供了少量的API函数实现客户和服务端COM应用的创建过程。在客户端,主要是一些创建函数;而在服务器端,提供一些对对象的访问支持。
② COM通过注册表查找本地服务器即EXE程序,以及程序名与CLSID的转换等。
③ 提供了一种标准的内存控制方法,使应用控制进程中的内存的分配。
COM特性
① 语言无关性,只要所选择的语言能支持COM组件的生成,则按COM组件模型构造的系统就允许使用此种编程语言。
② 进程透明性,COM所提供的服务组件对象在实现时有两种进程模型:进程内对象和进程外对象。如果是进程内对象,则它在客户进程空间中运行(效率高);如果是进程外对象,则它运行在同一机器的另一个进程空间或者在远程机器的进程空间中(稳定性好)。(在这就不细分了,以后应该会写到) 实现这种进程透明性的关键在于COM 库,COM库负责组件程序的定位,管理组件对象的创建和对象与客户之间的通信。当客户创建组件对象时,COM库负责装入组件模块或者启动组件进程,如果客户指定在远程机器上创建,则两台机器上的COM会协作完成远程COM对象的创建工作,并且在客户进程中创建一个代理对象,客户程序直接与代理对象进行交互。因此,客户程序可以不管组件对象的进程模型,即使组件的进程模型发生了变化,客户程序也不需要重新编译。(通俗点说来就是用就行了,COM库已经把你所操心的问题解决了,就像信用卡一样,你只要负责刷卡就行,其他的自然有人帮你安排,羡慕啊)
③ 可重用性,这是任何对象模型的实现目标,尤其对于大型的软件系统。由于COM标准是建立在二进制代码级的,因此COM对象的可重用性与一般的面向对象语言如C++对象的重用过程不同。主要有两种机制吧:包容和聚合。(后面再详细讨论)
待续:
FOTTI
2006-12-27于公司闲暇时