摘要:组件对象模型(componctObjoctModel,COM)是目前最为热门的面向对象的中间件技术。分析COM对象和接口的创建,实现COM的客户端和服务器,并且重点分析COM组件的整个运行过程。同时分析了COM组建的两种复用形式:组件的包容和聚合。
关键词:中间件 面向对象 COM组件 组件包容 组件聚合
中***分类号:TP3 文献标识码:A 文章编号:1007-3973(2011)004-061-02
1 引言
在对中间件技术的研究当中,COM是一种十分完善的面向对象的技术规范。COM是开发软件组件的一种方法。而COM组件通常是以Win32动态链接库(Dlls)或可执行文件(EXES)的形式的可执行代码组成的,他可以给应用程序,操作系统及其他文件提供跨平台的服务。COM的核心思想就是定义软件中可以重用的部分,每一部分都有其特定的界面和所能提供的服务从而达到二进制代码重用的目的。
在COM技术的体现与结构中,组件和接口是其核心的概念。其中,组件是具有一定逻辑功能的可执行代码,而接口实现了对组件各种技术细节的封装与隔离,对外界提供了透明的功能支持。通常情况下一个两接口的COM对象如***1所示。
2 COM对象和接口的创建
每一个COM组件都有一个相同的接口IUnknown,它是其他接口的祖先,每一个接口都是直接或间接从它派生而来。COM接口就是一个包含多个函数声明的虚基类,它的实现是在组件对象的内部完成的。而不同接口是通过从祖先接口派生下来的统一函数Querylnerface()来进行准换的。接口只是为用户提供调用方式,而组件却是具体功能的提供者。
为了让COM组件与客户更加地隔离开来,COM技术规范要求在客户与COM组件之间加上一个结构类似于组件的类厂,并利用类厂专门创建对应的组件。每一个组件都有一个对应的类厂,它们拥有同一个名字以供用户访问。这样,客户与COM组件的交互就必须通过其对应的类厂,从而提高了组件的封装性。而在以动态链接库的形式设计COM时会导出DllGetClassObjcot(),DllRegisterServer(),DllCanUnloadNow(),DllUnregisterServer()四个函数以供与用户进行交互。其体系结构如***2所示。
GUID是全局唯一标识符,它是COM的特殊名字并具有全球唯一性,而COM正是通过这个特殊的名字来进行身份识别的。通常,COM对象和接口的创建并不是直接在客户端直接进行的,而是客户程序直接调用CoCreatelnstace()函数进而转调CoGetClassObject()函数,并通过该函数的参数传入要使用的组件的GUID。而CoGetClassObject()函数只是转调组件所对应的Dll导出函数DllGetClassObject()函数。通过DllGetClassObjectt()函数创建组件的类厂,而在组件类厂创建后会调用CreateInstace()函数从而创建真正的组件对象并返回给客户该组件的一个接口指针,从而完成组件的创建。其流程如***3所示。
3 COM的整个运行过程
在服务器端,COM组件会通过DllRegisterServer()函数进行注册,并注册到系统的注册表中。而客户首先要初始化COM库,然后调用COM库中已经实现了的CoCreatelnstaee(),而CoCreatelnstace()实际是调用CoGetClassObject()函数实现的。CoGetClassObject()将会在注册表中查找指定的组件。找到之后,它将装载实现此组件的DLL。装载成功之后,它将会调用DLL服务器中的DLLGe tClassObject(),从而创建相应的类厂,同时该函数还会将查询IClassFactory接口,并将其返回给CoCreatelnstace()函数。然后CoCreatelnstace()将使用此接口来调用IClassFactory::Createlnstance()函数从而创建相应的组件,并返回组件的某个接口。客户在得到组件接口后就可以通过接口调用组件中的某个方法从而提供服务。在使用完COM组件某个接口的服务之后,必须要将该接口的指针进行释放。最后在使用完COM组件之后还要关闭COM库。具体流程如***4所示。
4 COM组件的复用
4.1组件的包容
包容是在接口级上完成的。外部组件包含内部组件接口的指针。此时外部组件只是内部组件的一个客户,它将使用内部组件的接口来实现它自己的接口,其具体结构如***5所示。
组件包容的实现只需在外部组件保存指向内部组件的指针。当客户需要使用内部组件的某些功能时,外部组件可以通过指向内部组件的指针进行转调,从而完成甚至增加或修改该功能。
4.2组件的聚合
组件的聚合就是直接将内部组件的接口直接暴露给客户,而客户并不知道这是内部组件的接口,始终认为这是外部组件的接口。客户直接通过还接口使用内部组件对应的功能,其具体结构如***6所示。
组件的聚合比较复杂,它需要对内部组件的结构进行改造,让内部组件有和非两个未知接口。通过判断该组件是否被聚合,从而选择不同的未知接口。
5 结束语
随着计算机软硬件和Intemet技术的不断发展,越来越多的应用需要在不同的平台和环境中运行与使用,而COM技术正是提供了跨平台服务的基础。而要想真正理解COM并且使用COM,则必须了解COM的这个开发过程。COM的技术正不断地发展,现在出现了DCOM,COM+等基于COM的新技术,这为计算机软件开发提供了可靠保证。因此,了解并学习COM是具有很现实的指导意义。
参考文献:
[1]潘爱民.COM原理与应用[M].清华大学出版社,1999.
[2]张云勇,张智讲,刘锦德等.中间件技术原理与应用[M].清华大学出版社。2003.
[3]杨秀章,译.Dale 技术内幕[M].清华大学出版社,1997.