熟悉面向对象编程和网络编程的人一定对activex、ole和com/dcom这些概念不会陌生,但是它们之间究竟是什么样的关系,对许多们还是比较模糊的。在具体介绍它们的关系之间,我们还是先明确组件(component)和对象(object)之间的区别。组件是一个可重用的模块,它是由一组处理过程、数据封装和用户接口组成的业务对象(rules object)。组件看起来像对象,但不符合对象的学术定义。它们的主要区别是: 1)组件可以在另一个称为容器(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用; 2)组件可以由一个类构成,也可以由多个类组成,或者是一个完整的应用程序; 3)组件为模块重用,而对象为代码重用。现在,比较流行的组件模型有com(component objiect module,对象组件模型)/dcom( distributed com,分布式对象组件模型)和corba(common object request broker architecture,公共对象请求代理体系结构)。到这里,已经出现了与本文相关的主题com,而corba与本文无关,就不作介绍。之所以从组件与对象的区别说起,是想让大家明确com和 corba是处在整个体系结构的最底层,如果暂时对此还不能理解,不妨继续往下看,最后在回过头看一看就自然明白了。现在开始阐述activex、ole和com的关系。首先,让大家有一个总体的概念,从时间的角度讲,ole是最早出现的,然后是com和activex;从体系结构角度讲,ole和activex是建立在 com之上的,所以com是基础;单从名称角度讲,ole、activex是两个商标名称,而com则是一个纯技术名词,这也是大家更多的听说activex和ole的原因。既然ole是最早出现的,那么就从ole说起,自从windows操作系统流行以来,“剪贴板”( clipboard)首先解决了不同程序间的通信问题(由剪贴板作为数据交换中心,进行复制、粘贴的操作),但是剪贴板传递的都是“死”数据,应用程序开发者得自行编写、解析数据格式的代码,于是动态数据交换(dynamic data exchange,dde)的通信协定应运而生,它可以让应用程序之间自动获取彼此的最新数据,但是,解决彼此之间的“数据格式”转换仍然是程序员沉重的负担。对象的链接与嵌入(object linking and embedded,ole)的诞生把原来应用程序的数据交换提高到“对象交换”,这样程序间不但获得数据也同样获得彼此的应用程序对象,并且可以直接使用彼此的数据内容,其实ole是microsoft的复合文档技术,它的最初版本只是瞄准复合文档,但在后续版本ole2中,导入了com。由此可见,com是应ole的需求而诞生的,所以虽然com是ole的基础,但ole的产生却在com之前。 com的基本出发点是,让某个软件通过一个通用的机构为另一个软件提供服务。com是应ole 的需求而诞生,但它的第一个使用者却是ole2,所以com与复合文档间并没有多大的关系,实际上,后来com就作为与复合文档完全无关的技术,开始被广泛应用。这样一来, microsoft就开始“染指”通用平台技术。但是com并不是产品,它需要一个商标名称。而那时microsoft的市场专家们已经选用了ole作为商标名称,所以使用com技术的都开始贴上了 ole的标签。虽然这些技术中的绝大多数与复合文档没有关系。microsoft的这一做法让人产生这样一个误解ole是仅指复合文档呢?还是不单单指复合文档?其实ole是com的商标名称,自然不仅仅指复合文档。但microsoft自己恐怕无法解释清楚,这要花费相当的精力和时间。 于是,随着internet的发展,在1996年春,microsoft改变了主意,选择activex作为新的商标名称。activex是指宽松定义的、基于com的技术集合,而ole仍然仅指复合文档。当然, activex最核心的技术还是com。activex和ole的最大不同在于,ole针对的是桌面上应用软件和文件之间的集成,而activex则以提供进一步的网络应用与用户交互为主。到这里,大家应该对activex、ole和com三者的关系有了一个比较明确的认识,com才是最根本的核心技术,所以下面的重点com。让对象模型完全独立于编程语言,这是一个非常新奇的思想。这一点从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、ole和com/dcom的关系有了一个清楚的了解。
使用windows的人对于activex控制一定不会陌生,它提供了一种类似于dll动态链接库的调用,不过它与dll的唯一区别就是activex不注册不能被系统识别并使用。那么,当我们得到一个activex没有被正确安装且不能使用的消息后,又要安装activex怎么办呢?1.regsvr32程序法在windows的system文件夹下有一个regsvr32.exe的程序,它就是windows自己带的activex注册和反注册工具。利用它也能够非常方便地注册acitvex控件,它的用法为:regsvr32/u/s/n/i dllname, dllname其中dllname为activex控件文件名,建议在安装前拷贝到system文件夹下参数有如下意义:/u - 反注册控件/s - 不管注册成功与否,均不显示提示框/c - 控制台输出/i - 跳过控件的选项进行安装 (与注册不同)/n - 不注册控件,此选项必须与/i 选项一起使用例如笔者要注册一amovie.ocx控件,则打入 regsvr32 amovie.ocx即可,要反注册它时只需使用 regsvr32 /u amovie.ocx就行了。2.注册表法所谓注册acitvex,无非是将一些信息记录在windows的注册表中,如shockwave flash object控件,我们可以运行regedit.exe注册表编辑程序,利用关键字进行搜索,然后把搜索得到后的注册表导出为一reg注册表文件,再将其相应的activex文件拷贝到windows的system文件夹(一般activex的文件名为ocx,安装在windows的system文件夹内)下,最后在要安装activex的机器上双击导入刚才导出的注册表文件即可完成安装。
activex,ole,com都是微软的一些技术标准。ole比较老后来发展成activex,再后来发展成为com ocx,dll是扩展名。 activex有两种扩展名ocx和dll。实际上你可以把它们的扩暂名字调换。 com作为activex的更新技术,扩展名也有可能是dll dll文件还有可能是动态链接库。主要是装载一些函数,可以动态加载。
from : http://hi.baidu.com/yaolihui/blog/item/aa9cfcce91931e0192457eb5.html
本博客为学习交流用,凡未注明引用的均为本人作品,转载请注明出处,如有凯发k8网页登录的版权问题请及时通知。由于博客时间仓促,错误之处敬请谅解,有任何意见可给我留言,愿共同学习进步。