浅谈COM/DCOM组件技术关键词:COM/DCOM组件技术面向对象程序开发内容提要:1946年,世界上第一台计算机诞生于美国的宾西法尼亚州,从那一天起,人类便逐渐从工业时代进入信息时代。伴随着计算机的发展,计算机网络技术也取得了飞速的发展。其中,组件技术是近年发展起来的一种非常优秀的软件重用技术,它给用户带来了极大的方便。目前,国内主要使用微软公司的COM/DCOM组件技术来进行应用程序的开发以及基于Web-based多媒体教学软件的开发。在教学软件迈向网络化与智能化的过程中,COM/DCOM组件技术将以软件技术的DNA这一形式推动着教学软件开发技术的飞速发展。1946年,世界上第一台计算机诞生于美国的宾西法尼亚州,从那一天起,人类便逐渐从工业时代进入信息时代。在过去的50多年中,以计算机为核心的信息技术取得了史无前例的发展。计算机从起初的占用一个房间的大型机变成了如今的小体积的微型机,同时计算机的速度也提高了上百倍、上万倍。计算机为社会经济的发展起到了重要的促进作用,为人们的生活带来了无穷的乐趣。伴随着计算机的发展,计算机网络技术也取得了飞速的发展。如今,人们可以依靠计算机网络链接位于广阔地理位置上的数以万计的办公室机构,可以期望按一下按钮就可以知道最遥远地点的当前情况,可以在远距离之间实现可视化交谈。组件技术在计算机的网络化和多媒体应用中发挥着重要的作用。伴随着计算机的产生与发展,与计算机相关的软件技术也得到了迅速的发展。其中,组件技术是近年发展起来的一种非常优秀的软件重用技术,它给用户带来了极大的方便。采用组件技术开发软件就像小朋友搭积木一样容易。所谓组件,就是具有某种特定功能的软件模块,组建的功能不仅全面而且强大,几乎可以完成任何任务。目前,主要的组件技术有COM/DCOM、CORBA等几种。随着网络技术的发展,组件技术在应用程序开发和Web信息发布中得到广泛的应用。目前,国内主要使用微软公司的COM/DCOM组件技术来进行应用程序的开发以及基于Web-based多媒体教学软件的开发。COM/DCOM组件技术是由Microsoft公司与DEC公司于1995年提出的,COM代表ComponentObjectModel(组件对象模型),而DCOM代表DistributedComponentObjectModel(分布式组件对象模型)。COM模型用于异质网络和操作系统中创建、使用和加入可重复使用的组件对象,理论上,这些组件对象可以互相通讯与交互,而与它们的语言、分布及原始平台无关。COM规程包括一套标准API、一个标准的接口集以及COM用于支持分布式计算的网络协议。而DCOM模型则是一套用于分布式环境中的COM对象,在DCOM环境中,位于一个网络上的COM对象能与位于另一个网络上的COM对象进行通信。通常我们可以把COM看作是某种(软件)打包技术,即把它看作是使软件的不同部分按照一定的面向对象的形式,组合成可以交互的过程和一组支持库。COM对象可以用C++、JAVA和VB等任意一种语言编写,并且可以以DLL或作为不同过程工作的执行文件的形式来实现。使用COM对象的客户端,无需关心对象是用什么语言写的,也无需关心它是以DLL、还是以另外的过程来执行的。从速度上来看,COM(动态连接库形式)与客户共同存在于同一内存空间,调用速度快,DCOM的速度只有COM的万分之一。其实,DCOM本身就是COM的一种表现形式,但是由于大家听见COM一般就把它当成在本地执行的COM,而DCOM当然就是分布的COM,在网络上的另一台计算机上执行。COM有两种存在形式,动态连接库和可执行程序,但DCOM必须是可执行程序。因为DCOM不可能在客户程序的内存空间运行,所以不能是动态连接库。从另一方面来说,DCOM为面向对象的分布式计算定义了跨平台服务(或抽象),其中包括连接组件、创建组件、组件的定位、激活组件的方法以及一个安全性框架。除了这些之外,DCOM仅仅使用了每一个平台上都有的服务来完成多线程化和并发控制、用户界面、文件系统之间的相互作用、非DCOM网络的相互作用以及实际的安全性模块。COM/DCOM组件技术是从微软件的OLE发展起来的一种软件重用技术,采用的是面向对象的广泛,支持面向对象的各种特性。对拥有OLE基础的人而言,掌握COM/DCOM并不难,特别是微软提供了一个极好的工具——活动样板库ATL(ActiveTemplateLibrary),可用来创建DCOM和COM对象。通过ATLCOMAppWizard,VisualC++可生成大多数后台处理代码,如代理和存根模块代码,创建必要的COM类。通过ATLObjectWizard,你可以选择要插入的COM对象类型,配置对象的属性,如线程模型、界面类型,然后由该Wizard根据你的配置生成C++代码。,Microsoft的开发工具是高度可视化和高度自动化的。许多工作都是自动完成的,因此不用知道多少具体的技术细节就能很容易地进行开发。特别是随着ActiveX控件的推广,ActiveX控件的开发工具也逐日增多。由于ActiveX不依赖于语言,所以常见的可视化开发工具基本上都能构筑、配备ActiveX控件。最常用的有VisualC++、Delphi、VisualBasic和VisualJ++等。DCOM技术近几年发展势头很好,归咎其原因,我认为主要是因为DCOM有以下几个特点:1.DCOM的结构特点。DCOM是组件对象模型(COM)的进一步扩展。COM定义了组件和它们的客户之间互相作用的方式,它使得组件和客户端无需任何中介组件就能相互联系。当客户进程和组件位于不同的机器时,DCOM仅仅只是用网络协议来代替本地进程之间的通讯。无论是客户还是组件都不会知道连接它们的线路比以前长了许多。2.组件与复用。就目前的应用情况来看,大多数的分布式应用都不是凭空产生的,现存的硬件结构、软件、组件以及工具需要集成起来,以便减少开发和扩展时间以及费用。DCOM能够直接且透明地改进现存的对COM组件和工具的投资。对各种各样组件需求的巨大市场使得将标准化的解决方案集成到一个普通的应用系统中成为可能。许多熟悉COM的开发者能够很轻易地将他们在COM方面的经验运用到基于DCOM的分布式应用中去。任何为分布式应用开发的组件都有可能在将来被复用。围绕组件模式来组织开发过程使得你能够在原有工作的基础上不断的提高新系统的功能并减少开发时间。基于COM和DCOM的设计能使你的组件在现在和将来都能被很好到使用。3.DCOM位置独立性。当你开始在一个真正的网络上设计一个分布式应用时,以下几个相互冲突的设计问题会很清楚地反映出来:(1)相互作用频繁的组件彼此间应该靠得更近些。(2)某些组件只能在特定的机器或位置上运行。(3)小组件增加了配置的灵活性,但它同时也增加了网络的拥塞。(4)大组件减少了网络的拥塞,但它同时也减少了配置的灵活性。如果我们使用DCOM组件技术,这些设计上的限制将很容易解决,因为配置的细节并不是在源码中说明的。DCOM使得组件的位置对你来说完全透明,无论它是位于客户的同一进程中还是位于地球的另一端。在任何情况下,客户连接组件和调用组件的方法的方式都是一样的。DCOM不仅无需改变源码,而且无需重新编译程序。一个简单的再配置动作就可改变组件与组件之间相互连接的方式。DCOM的位置独立性极大地简化了将应用组件分布化的任务,使其能够达到最合适的执行效果。例如,设想某个组件必须位于某台特定的机器上或某个特定的位置上,并且此应用有许多小组件,你可以通过将这些组件配置在同一个LAN上,或者同一台机器上,甚至同一个进程中来减少网络的负载。当应用是由比较少的大组件构成时,网络负载并不是问题,此时你可以将组件放在速度快的机器上,而不用去过问这些机器到底在哪儿。下图显示了相同的“有效性检查组件”在两种不同情况下是如何分别配置的。一种情况是当“客户”机和“中间层”机器之间的带宽足够大时,它是怎样配置在客户机上的;另一种情况是当客户进程通过比较慢的网络连接来访问组件时,它又是怎样配置在服务器上的。有了DCOM的位置独立性,应用系统可以将互相关联的组件放到靠地比较近的机器上,甚至可以将它们放到同一台机器上或同一个进程中。即使是由大量的小组件来完成一个具有复杂逻辑结构的功能,它们之间仍然能够有效地相互作用。当组件在客户机上运行时,将用户界面和有效性检查放在客户端或离客户端比较近的机器上会更有意义;集中的数据库事务应该将服务器靠近数据库。4.DCOM的语言无关性在设计和实现分布式应用系统时,一个普遍的问题就是为开发一个特定的组件而选择语言以及工具的问题。语言选择是一个典型的在开发费用、可得到的技术支持以及执行性能之间的折衷。作为COM的扩展,DCOM具有语言独立性。任何语言都可以用来创建COM组件,并且这些组件可以使用更多的语言和工具。Java,MicrosoftVisualC++,MicrosoftVisualBasic,Delphi,PowerBuilder和MicroFocusCOBOL都能够和DCOM很好地相互作用。因为DCOM具有语言独立性,应用系统开发人员可以选择他们最熟悉的语言和工具来进行开发。语言独立性还使得一些原型组件开始时可以用诸如VisualBasic这样的高级语言来开发,而在以后用一种不同的语言,例如VisualC++和Java来重新实现,而这种语言能够更好地支持诸如DCOM的自由线程/多线程以及线程共用这些先进特性。5.DCOM的连接管理网络连接本身就比同一台机器中的连接更脆弱。当一个客户不再有效,特别是当出现网络或硬件错误时,分布式应用中的组件需要被加以注意。DCOM通过给每个组件保持一个索引计数来管理对组件的连接问题,这些组件有可能是仅仅只连接到一个客户上,也有可能被多个客户所共享。当一个客户和一个组件建立连接时,DCOM就增加此组件的索引计数。同理,当客户释放连接时,DCOM就减少此组件的索引计数。如果索引计数为零,组件就可以被释放了。DCOM使用有效的地址合法性检查(pinging)协议来检查客户进程是否仍然是活跃的。客户机周期性地发送消息,当经过大于等于三次ping周期而组件没有收到pinging消息时,DCOM就认为这个连接中断了。一旦连接中断,DCOM就减少索引计数,当索引计数为零时就释放组件。从组件的这一点看来,无论是客户进程自己中断连接这种良性情况,还是网络或者客户机崩溃这种致命情况,都被同一种索引计数机制处理。在很多种情况下,组件和它的客户进程之间的信息流是没有方向性的:组件需要在客户端进行某些初始化操作,例如一个长进程的结束,用户所观看数据的更新,或者诸如电视以及多用户游戏这些协作环境中的下一条信息等。许多协议使得完成这种对称性的通讯十分困难。使用DCOM,任何组件都既可以使功能的提供者,有能是功能的使用者。通讯的两个方向都用同一种机制来管理使得完成对等通讯和客户机/服务器之间的相互作用一样容易。DCOM提供了一个对应用完全透明的分布式垃圾收集机制。DCOM是一个天生的对称性网络协议和编程模型。它不仅提供传统的单向的客户机-服务器之间的相互作用方式,还提供了客户机和服务器以及对等进程之间的丰富的交谈式的通讯方式。6.DCOM的可扩展性分布式应用的一个重要因素是:它的处理能力能够随着用户的数量、数据量所需性能的提高而增加。当需求比较小时,应用系统就比较小而速度快,并且它要能够在不牺牲性能和可靠性的前提下处理附加的需求。DCOM提供了许多特性来增强你的应用的可扩展性。7.对称的多进程处理(SMP)DCOM提高了WindowsNT对于多进程处理的支持。对于使用自由线程模式的应用,DCOM使用一个线程队列来处理新来的请求。在多处理器机上,线程队列是由可利用的处理器的数量来决定的:太多的线程会导致经常性的上下文切换,而太少的线程又会使处理器处于空闲状态。DCOM只提供一个手工编码的线程管理器,从而使开发者从线程的细节中解脱出来并获得最好的性能。DCOM通过使用WindowsNT对于对称性多进程处理的