Developing COM Components using VC-ATL(2)

类别:VC语言 点击:0 评论:0 推荐:

COM基础知识

COM的产生

应用程序被开发来支持公司业务运转,应用程序获取作为输入的数据,处理基于业务规则的数据,和提供作为输出的数据和信息。基于这一事实,所有的应用程序都有三个要素:

n          用户界面或呈现要素,通过它们可以输入数据。

n          应用程序逻辑或业务规则要素,它们有助于实现对输入数据执行有效性、可用性操作。

n          数据存储或数据管理要素,它们管理数据的存储和恢复。

这三个要素养组成了用于应用程序开发模型或体系结构的基础。

 

根据具体的用途和配置,开发都在他们的应用程序中决定采用何种体系结构时有三种选择:

n          单层模型

n          双层模型

n          三层或多层模型

 

作为一个开发者,在决定应用程序的体系结构之前,你要考虑以下因素:

n          伸缩性:这指的是应用程序适应新的硬件环境的性能。例如,当一个应用程序从一个单处理器计算机移到一个多处理计算机时,它是否能使用新增加的处理器,这些处理器在新硬件上是否发挥了作用。

n          可用性:这指的是应用程序满足用户增加要求的能力。可能有一百个用户正在请求同样的数据,但是只有少数用户获得数据,其他的用户则显示一则消息“请稍后再试”。

n          扩展性:这指的是应用程序有时递增地增加特色来提高性能和提供更好的功能给用户的能力。

n          维护性:这指的是根据人力和时间使用最小化的资源和最大化的有效性来响应修修复改错误的能力。

n          安全性:这指的是应用程序维持数据完整性、可靠性的能力。任何未经认可的用户都不允许篡改数据。

n          性能:这指的是应用程序在最短的时间内响应用户请求的能力。用户不要等待很长时间就能获得请求数据。

 

为了设计更健壮的应用程序体系结构,三(多)层体系结构就运用而生。三层体系结构是一种逻辑应用程序观点,在这种体系结构中应用程序分成以下三层逻辑组成部分:

n          用户服务层。用户服务层管理用户界面。

n          业务服务层。业务服务层管理由应用程序实现的业务逻辑。业务逻辑由支配应用程序处理的规则组成。这一层对用户封装了业务逻辑,因而用户不必了解业务逻辑或业务规则是如何使用的。业务规则的任何变化将导致仅对业务服务层的更改,而应用程序的其余部分保持不变。业务服务层实现用于应用程序的多条规则。这一层扮演了用户服务层和数据服务层间连接的角色。

n          数据服务层。数据服务层负责维护数据,通常为RDBMS。这一层维护数据的有效性和完整性,并且负责从数据存储中增加、修改和删除数据。

 

现在,我们如何来做业务服务层呢?答案就是COM。

 

什么是COM?

COM即为组件对象模型,它为开发组件定义了标准。它定义了组件交互标准、协议标准和组件的物理结构来确保组件间的互用性。一个组件就是一个执行特定操作的程序或二进制对象。下面我们就从组件的一些特点和功能来理解一下COM:

n          COM是一种规范。COM规范描述了为创建能共同操作的组件而必须遵守的标准。这个标准描述了COM是什么和它们是如何运转的,以及说明了如何可动态交替更新组件。

n          COM是一套服务。COM规范是由一套服务或APIs来支持的。COM库提供这些服务,它们是WIN32平台操作系统的一部分并且可用于当作其他操作系统的一个单独的包。

n          COM是面向对象的。COM组件对象有标识、状态和行为。

n          COM能够容易的用户化和升级你的应用程序。COM组件动态地相互联结,并且COM定义了定位其他组件和鉴定其功能的标准。因此,组件可以交换而不必重新编绎整个应用程序。

n          COM能够分布式应用。位置透明性是COM的特性之一。这使得你可以编写COM组件而不必考虑它们的位置。组件可以移动而不要求对使用它们的应用程序作任何改变。

n          COM组件可以用任何语言编写。任何能够处理二进制语言都能用于创建COM对象。能创建组件的语言和工具包括C/C++、JAVA、VISUAL BASIC和VISUAL C++等。

 

        到目前为止,微软提倡的这套COM软件开发模式是最为符合现在计算机工业软件生产的方法。Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。并且Microsoft的开发人员也大量使用COM组件来定制他们的应用程序及操作系统。在COM构架下,程序员可以开发出各种各样的功能专一的组件,然后将它们按照需要组建起来,构成复杂的应用系统。由此带来的好处是多方面的:

n          使用组件的最大好处首先是可以将它们动态的插入或卸出应用系统,是真正意义上的软件模块即插即用。组件可以在运行时刻,在不被重新链接或编译应用程序的情况下,可以将系统中的组件用新的组件替换掉,以便即时方便地进行系统的升级和定制。这样做的最大好处是程序员可以利用最新的技术写出的最新组件取代以有的旧组件而整个系统的其他部分不需要一点改动。应用程序可以随新组件不断取代旧的组件而渐趋完善且健壮。而且利用已有的组件,用户还可以快速的建立全新的应用。(注意:替换的组件均为自定义的组件,不是COM本身的运行时间库中的组件)

n          二进制重用。按照COM规范,组件可以在多个应用系统中重复利用同一组件。

n          分布式应用。利用COM/DCOM组件技术,可以方便的将应用系统扩展到网络环境下。

n          COM与语言无关。可以使用多种语言编写COM组件,如DELPHI、VISUAL BASIC…这使得程序员可以利用自己擅长的语言来编写组件,而无须学习其他专门的语言来编写组件。

n          COM与平台无关。利用已编写的组件可以方便地在不同平台间移植。

 

在三层体系结构中,创建COM组件来实现业务服务层。因为COM组件能够相互作用,每个组件必须严格地贯彻由COM拟定的完整的标准。

 

COM具有显著的优点在于它提供了三个独有的特性:

n          调用组件间功能的二进制标准。COM确保用VISUAL BASIC开发的客户端和用VISUAL C++开发并且运行于Solaris或Mac服务端的组件间完全的二进制的兼容性。因此,COM允许你创建确实是独立于语言和操作系统的代码模块。

n          代码重用。因为接口是文档化的,所以创建对象的代码能被不同的客户使用。

n          版本控制。基于COM的组件是自我版本化的。暗示新的功能可以增加到组件中,而不影响已使用该组件的用户(/客户)

 

由此可见,COM组件是真正地面向对象,提供简易的用户化,提供地址透明并且能用任何语言编写。正由于COM具有这些优点,COM得到了广泛应用。

 

COM组件是真正地面向对象

n          传统的面向对象编程

  面向对象编程是一个被广大编程人员和工业界认同已久的概念。面向对象程序设计语言让开发者按照现实世界里人们思考问题的模式来编写程序,它让开发者更好地用代码直接表达现实中存在的对象,这样开发代码简单并且易于维护。面向对象语言有以下三个最重要的概念:

n          封装(Encapsulation) 强调隐藏对象的实现细节,对象的使用者仅仅通过定义好的接口使用对象。

n          继承(Inheritance) 新的对象可以利用旧的对象的功能。

n          多态(Polymorphism) 根据所使用的对象展现多种不同行为的能力。

而从程序的整体来看,面向对象编程提供给用户的最重要的概念则是源代码重用,它对于提高编写程序的效率极为重要。但是代码的共享与重用一旦应用于实践中仍然存在种种问题,如版本的升级、接口[1]的变化、在不同程序设计语言之间共享代码等等。对于这些困难原有的面向对象程序设计方法并没有相应的答案,这就是组件对象模型提出的背景。

n          基于组件编程

它与传统面向对象模型有着根本的区别,传统的面向对象编程模型的重点是源程序以及系统分析和设计过程,面向对象归根到底还是基于源代码的重用,不是真正意义上的面向对象。相反,COM组件的概念则强调大的软件系统如何由不同的小组件构成整体应用程序体系结构。

将工程分解为逻辑组件是面向组件分析和设计的基础,这也是组件软件的基础。组件软件系统由可重用的二进制形式的软件组件模块组成,只需要相当小的改动就可以将这些来自不同开发商的组件模块组合在一起。特别重要的是这样的组合并不需要源代码,也不需要重新编译,组件之间是通过基于二进制的规范进行通讯的,这被称为二进制重用。组件模块是独立于编程语言的,使用组件的客户程序和组件之间除了通过标准的方法进行通讯以外,彼此不做任何限定。

组件可以划分为不同的类型,包括可视化组件如按钮或者列表框;功能组件如打印或者拼写检查。例如一个基于组件的架构可以提供将多个开发商的拼写检查组件插入到另一个开发商的字处理应用程序中的机制,这样用户可以根据自己的喜好方便地选择和替换字处理软件。

 

COM允许你创建相互联合起来形成应用程序的独立的、可重用的组件。在COM中,组件间的相互作用是基于Client/Server模型的(即客户机和服务器模型)。基于这个模型,COM组件可以分类为:

n          Client 使用由其他组件提供的功能。

n          Server 有其他组件可能使用的预先确定的功能的组件。

客户程序和组件程序是相对的,进行功能请求调用的是客户程序,而响应该请求的是组件程序。组件程序也可以作为客户程序去调用其它的组件程序,即提供服务给客户端的COM服务器可能是客户本身。正是这种角色的转换和相互调用关系使组件程序最终构成一个软件系统。

 

    服务器组件的类型

    COM设计为允许组件相互通信而不管它们的地址。例如,用户接口组件将最好定位于接近客户端。另一方面,提供远程数据统计计算的组件将随同将被操作的数据可能定位在一台分离的计算机上。COM服务端组件可分为三类:

n          进程内组件 进程内服务器[2]是装入客户端的进程空间内的组件,即客户程序和组件程序在同一个进程地址空间内。在客户端和服务端组件间有大量数据转移操作的情况下是理想的。进程内服务器会更快地装载。由于它占用和客户端应用程序同样的地址空间,它可以与客户端更快的通信。进程内服务器是通过将组件作为动态连接库(DLL)的形式来实现的。DLL允许特定的一套功能以分离于可执行的、以DLL为扩展名的文件进行存储。只有当程序需要它们时,DLL才将其装入内存中,客户程序将组件程序加载到自己的进程地址空间后再调用组件程序的函数。

n          本地(即进程外)组件 进程外组件指客户程序和组件程序分别处在不同的进程空间地址中。进程外服务器对需要运行于独立的处理空间或作为独立客户端应用程序的线程的组件是理想的。这种服务器的类型自身是EXE,因此具有独立的进程的资格。由于数据必须从一个地址空间移到另一个地址空间,因此这些服务器就会慢得多。由于进程外服务器是可执行的,它们运行在自己的线程内。当客户端代码正在执行时,客户端不锁住服务器。进程外服务器对需要表现为独立的应用程序的组件也是理想的。例如,Microsoft Internet Explorer的应用程序是本地服务器的例子。客户端和服务端的通信是通过进程内的通信协议进行的,这个通信协议是IPC。

n          远程组件 远程服务器与本地服务器类似,除了远程服务器是运行在通过网络连接的分离的计算机上。这种功能是使用DCOM实现的。DCOM的优点在于它并不要求任何特别的编程来使具有功能。另外服务端和客户端通信是通过RPC通信协议进行的。

 

对于这三种不同的服务器组件,客户程序和组件程序交互的内在方式是完全不同的。但是对于功能相同的进程内和进程外组件,从程序编写的角度看,客户程序是以同样的方法来使用组件程序的,客户程序不需要做任何的修改。

本文地址:http://com.8s8s.com/it/it1340.htm