Just a blog
分类: WINDOWS
2011-03-01 09:42:32
前述
组件(Component)和对象(Object)的区别
组件是一个可重用的模块,它是由一组处理过程、数据封装和用户接口组成的业务对象(Rules Object).
组件看起来像对象,但不符合对象的学术定义。它们的主要区别是:
1)组件可以在另一个称为容器(Container,也称承载者或宿主)的应用程序中使用,也可以作为独立过程使用;
2)组件可以由一个或多个类构成,或者是一个完整的应用程序;
3)组件为模块重用,而对象为代码重用。
组件模型---比较流行的组件模型有COM(Component Object Module,对象组件模型)/DCOM(Distributed COM,分布式对象组件模型)和CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)。COM和CORBA是处在整个结构的最底层。
总体的概念
时间角度:OLE -> COM -> ActiveX
体系结构角度:OLE和ActivX建立在COM之上.COM是基础.
名称角度:OLE、ActiveX 是两个商标名称,COM 是一个纯技术名词
OLE
自从Windows操作系统流行以来,“剪贴板”(Clipboard)首先解决了不同程序间的通信问题(以剪贴板作为数据交换中心,进行复制、粘贴的操作),但是剪贴板传递的都是“死”数据,应用程序开发者自行编写、解析数据格式的代码。作为COM技术前身的OLE,其最初含义是指在程序之间链接和嵌入对象数据(Object Link Embeded)。它提供了动态数据交换(Dynamic Data Exchange,DDE)的通信协定应运而生,它可以让应用程序之间自动获取彼此的最新数据。但是,解决彼此之间的“数据格式”转换仍然是程序员沉重的负担。对象的链接与嵌入(Object Linking and Embedded,OLE)的诞生把原来应用程序的数据交换提高到“对象交换”,这样程序间不但获得数据也同样获得彼此的应用程序对象,并且可以直接使用彼此的数据内容,其实OLE是Microsoft的复合文档技术,它建立混合文档的手段,使得那些没有太多专业知识的用户能够很容易地协调多个应用程序完成混合文档的建立。但在后续版本OLE2中,导入了COM。由此可见,COM是应OLE的需求而诞生的,所以虽然COM是OLE的基础,但OLE的产生却在COM之前。微软于1993年发布了新的规范——OLE2.0,它在原有的基础上完善并增强了以下各方面的性能:
1.OLE自动化:一个程序有计划地控制另一个程序的能力。
2.OLE控件:小型的组件程序,可嵌入到另外的程序,提供自己的专有功能。
3.OLE文档:完善了早期的混合文档功能,不仅支持简单链接和嵌入,还支持在位激活、拖放等功能。
强大的功能使得很多的开发商开始支持新的OLE技术,因为微软在OLE2.0中建立了一个称为
COM(Component Object Model即组件对象模式)的新规范。
COM
COM,Components Object Model (COM) 是软件组件互相通讯的一种方式。简单地说,是一种不同应用程序和不同语言来共享二进制代码的方法,允许任意两个组件互相通讯,而不管它们是在什么计算机上运行(只要计算机是相连的),不管各计算机运行的是什么操作系统(只要该系统支持 COM),也不管该组件是用什么语言编写的。COM 还提供了位置透明性:当您编写组件时,其他组件是进程内 DLL、本地 EXE 还是位于其他计算机上的组件,对您而言都无所谓。不同于C++,只是源代码级的重用。Windows允许你使用DLL实现二进制级的代码共享,如kernel32.dll,user32.dll等,但因为这都是用C写的DLL,所以它们只能被C或者理解C调用方式的语言所调用。MFC引入了另一种二进制级的代码共享机制--MFC extension DLLs,但这种机制限制更多,你只能在MFC程序中使用它们。而COM通过建立一种二进制的规范来解决这些问题,这也意味着COM二进制模块要按照一种特别的结构来组织,在内存中亦然。规则是语言无关的,重担交给了编译器。
COM的基本出发点是,让某个软件通过一个通用的机构为另一个软件提供服务。COM是应OLE的需求而诞生,但它的第一个使用者却是OLE2,所以COM与复合文档间并没有多大的关系,实际上,后来COM就作为与复合文档完全无关的技术,开始被广泛应用。这样一来,Microsoft就开始“染指”通用平台技术。但是COM并不是产品,它需要一个商标名称。而那时Microsoft的市场专家们已经选用了OLE作为商标名称,所以使用COM技术的都开始贴上了OLE的标签。虽然这些技术中的绝大多数与复合文档没有关系。Microsoft的这一做法让人产生这样一个误解OLE是仅指复合文档呢?还是不单单指复合文档?其实OLE是COM的商标名称,自然不仅仅指复合文档。但Microsoft自己恐怕无法解释清楚,这要花费相当的精力和时间。
首先,COM 对象被很好地封装起来。您无法访问对象的内部实现细节;您无法知道 对象使用了什么数据结构实际上,对象的封装是如此的严密,以致于 COM 对象通常被描绘为盒子。细节是不会告诉你的,但是我们可以通过接口来访问COM对象里面的方法,当然如果COM组件提供商肯告诉你那些接口中的函数和属性起什么作用的话。
概括地说,COM具有如下一些优越性:
1, 编程技术难度和工作量降低,开发周期变短,开发成本降低。一般编程人员只须根据应用功能要求选用合适的组件,而不必事无巨细都自己动手去完成。组件模块将编程的技术难度和工作量在人员个体和时间上进行了分摊。
2,实现分层次的编程,从而促进了软件的专业化生产。专业人员可以开发出具有很强专业性的软件组件,这样既保证了普通的编程应用人员能够完成所需要的应用开发,又不至于降低使用的性能。应用人员不便实现的组件模块可以让专业人员定做。
3,软件的复用率提高,使软件的使用效率得到提高并延长了使用寿命。组件编程体系使大量的编程问题局部化了,使软件的更新和维护变得快速和容易,软件的成本大大降低。新的函数功能如果在接口没有改变的情况下很容易使用。
COM特征
1. COM不是接口,也不是对象,它是一种标准。
2. 符合COM标准的对象就是我们要谈论的重点——COM对象。其实COM对象也无非是实现了很多接口的对象而已。
3. COM对象必须实现Iunknown接口,这个接口是管理COM对象生命周期的,当COM对象不使用的时候,是这个接口定义的方法负责释放内存。一个COM对象可以没有任何别的接口,但是这个必须要,它是默认实现的接口。
4. QI,即所谓查询接口。由于COM对象有很多个接口,不同的接口管理着COM的不同类型的方法,因此从一个接口可以使用的方法转到另一个接口可以使用的方法的过程称为QI,这个过程是由Idispatch接口管理的。
5. GUIDs ---每个组件都有一个独一无二的标识,这就是所谓的广泛唯一标识符。这个标识符就是COM组件的身份,它是一个128bits的数字,由系统自由分配(不要担心这个标识会有重复的一天。如果我们每秒产生1000万个UID,那么到5770年才可能遇到重复。别告诉我那个时候我们还使用WINDOWS的玩意)。
6. 一个COM对象可以有多个接口,一个接口也完全可以被多个COM对象实现。
7. 接口分为两种,内置接口和外置接口。前一种定义的是COM对象的方法和属性用implements实现,COM对象必须实现所有的接口内容;后一种定义的是COM对象的事件,用withEvents实现,这种接口在实现的时候不必实现所有的内容。
8. COM组件必须被注册后才能使用,它得到注册表那里去登记“户口”。COM组件很不错,可是它也有致命的缺陷,这个缺陷就来自它本身。我们知道,COM是可以被重用的,COM对象的实现过程也可以被修改升级(定义是不能修改的哦),如果两个程序都使用一个COM对象,而这个COM组件升级了的话,很可能就
出现某个程序无法使用新组件的情况,这就被称为“DLL HELL(DLL灾难)”,我们有时候安装了新软件后很多别的软件都无法使用,很多原因就是因为这个DLL HELL。(别以为这是个小问题,这可是人家微软提出.NET平台的一个主要原因)。
让对象模型完全独立于编程语言,这是一个非常新奇的思想。这一点从C++和Java的对象概念上,我们就能有所了解。但所谓COM对象究竟是什么呢?为了便于理解,可以把COM看作是某种(软件)打包技术,即把它看作是软件的不同部分,按照一定的面向对象的形式,组合成可以交互的过程和以组支持库。COM对象可以用C++、Java和VB等任意一种语言编写,并可以用DLL或作为不同过程工作的执行文件的形式来实现。使用COM对象的浏览器,无需关心对象是用什么语言写的,也无须关心它是以DLL还是以另外的过程来执行的。从浏览器端看,无任何区别。这样一个通用的处理技巧非常有用。例如,由用户协调运行的两个应用,可以将它们的共同作业部分作为COM对象间的交互来实现(当然,现在的OLE复合文档也能做到)。为在浏览器中执行从Web服务器下载的代码,浏览器可把它看作是COM对象,也就是说,COM技术也是一种打包可下载代码的标准方法(ActiveX控件就是执行这种功能的)。甚至连应用与本机OS进行交互的方法也可以用COM来指定,例如在Windows和Windows NT中用的是新API,多数是作为COM对象来定义的。可见,COM虽然起源于复合文档,但却可有效地适用于许多软件问题,它毕竟是处在底层的基础技术。用一句话来说,COM是独立于语言的组件体系结构,可以让组件间相互通信。随着计算机网络的发展,COM进一步发展为分布式组件对象模型,这就是DCOM,它类似于CORBA的ORB。
ActiveX
随着Internet的发展,在1996年春,Microsoft改变了主意,选择ActiveX作为新的商标名称。ActiveX是指宽松定义的、基于COM的技术集合,而OLE仍然仅指复合文档。当然,ActiveX最核心的技术还是COM。ActiveX和OLE的最大不同在于,OLE针对的是桌面上应用软件和文件之间的集成,而ActiveX则以提供进一步的网络应用与用户交互为主。
ActiveX最初只不过是一个商标名称而已,它所涵盖的技术并不是各自孤立的,其中多数都与Internet和Web有一定的关联。更重要的是,ActiveX的整体技术是由Microsoft的COM构筑的。但不要误认为ActiveX是定义了所有包含基于COM的技术。COM与Microsoft Office和Windows以及Microsoft所做的一切都有关联,但显然这些产品并不是ActiveX家族中的成员。
ActiveX是从Microsoft的复合文档技术——OLE成长起来的。ActiveX是Microsoft提出的一组使用COM使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序。
ActiveX的内容
ActiveX既包含服务器端技术,也包含客户端技术。其主要内容是:
1. ActiveX控制(ActiveX Control);用于向WEB页面、Microsoft Word等支持ActiveX 的容器(Container)中插入COM对象。
2. ActiveX文档(ActiveX Document);用于在WEB Browser或者其它支持ActiveX的容器中浏览复合文档(非HTML文档),例如Microsoft Word文档,Microsoft Excel文档或者用户自定义的文档等。
3. ActiveX脚本描述(ActiveX Scripting);用于从客户端或者服务器端操纵ActiveX控制和Java程序,传递数据,协调它们之间的操作。
4. ActiveX服务器框架(ActiveX Server Framework);提供了一系列针对WEB服务器应用程序设计各个方面的函数及其封装类,诸如服务器过滤器、HTML数据流控制等。
5. 在Internet Explorer中内置Java虚拟机(Java Virtual Machine),从而使Java Applet 能够在Internet Explorer上运行,并可以与ActiveX控制通过脚本描述语言进行通信。