原创文章,欢迎转载。转载请注明:转载自 祥的博客
原文链接:https://blog.csdn.net/humanking7/article/details/81253775
找到一篇非常不错的博文,无奈文章排版太差劲了,所以我重新排版了一下。
原文链接:https://www.xuebuyuan.com/2013734.html
1. 基础
熟悉面向对象编程和网络编程的人一定对ActiveX
、OLE
和COM/DCOM
这些概念不会陌生,但是它们之间究竟是什么样的关系,对许多们还是比较模糊的。在具体介绍它们的关系之间,我们还是先明确组件(Component)
和对象(Object)
之间的区别。
组件
是一个可重用的模块
,它是由一组处理过程、数据封装和用户接口组成的业务对象(Rules Object)
。组件看起来像对象,但不符合对象的学术定义。它们的主要区别
是:
组件
可以在另一个称为容器
(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用;组件
可以由一个类
构成,也可以由多个类
组成,或者是一个完整的应用程序
;组件
为模块重用,而对象
为代码重用。现在,比较流行的组件模型有COM
(Component Objiect Module
,对象组件模型)/DCOM
(Distributed COM
,分布式对象组件模型)和ORBA
(Common Object Request Broker Architecture
,公共对象请求代理体系结构)。
到这里,已经出现了与本文相关的主题COM
,而CORBA
与本文无关,就不作介绍。之所以从组件与对象的区别说起,是想让大家明确 COM
和 CORBA
是处在整个体系结构的最底层,如果暂时对此还不能理解,不妨继续往下看,最后在回过头看一看就自然明白了。
2.关系
现在开始阐述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
的关系有了一个清楚的了解。
3.注册ActiveX控件
使用Windows
的人对于ActiveX
控制一定不会陌生,它提供了一种类似于DLL
动态链接库的调用,不过它与DLL
的唯一区别就是ActiveX
不注册不能被系统识别并使用。那么,当我们得到一个ActiveX
没有被正确安装且不能使用的消息后,又要安装ActiveX
怎么办呢?
Regsvr32
程序法在Windows
的System
文件夹下有一个Regsvr32.exe
的程序,它就是Windows
自己带的ActiveX注册和反注册工具
。利用它也能够非常方便地注册ActiveX控件
,它的用法为:
regsvr32 /u /s /c /i /n dllname
其中dllname
为ActiveX控件
文件名,建议在安装前拷贝到System
文件夹下参数有如下意义:
/u
- 反注册控件
/s
- 不管注册成功与否,均不显示提示框
/c
- 控制台输出
/i
- 跳过控件的选项进行安装 (与注册不同)
/n
- 不注册控件,此选项必须与/i 选项一起使用.
例如:笔者要注册amovie.ocx
控件,则打入regsvr32 amovie.ocx
即可,
要反注册它时只需使用regsvr32 /u amovie.ocx
就行了。注册表法所谓注册
ActiveX
,无非是将一些信息记录在Windows的注册表中,如ShockwaveFlashObject
控件,我们可以运行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
文件还有可能是动态链接库,主要是装载一些函数,可以动态加载。