分享并讨论一个文章:关于ACTIVEX和COM基本概念的

slowgrace 2009-06-15 07:48:11
加精
来自:http://blog.sina.com.cn/s/blog_557ee0540100cukp.html

熟悉面向对象编程和网络编程的人一定对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的关系有了一个清楚的了解。

总结:Activex,OLE,COM都是微软的一些技术标准。Ole比较老后来发展成Activex,再后来发展成为COM OCX,DLL是扩展名。 Activex有两种扩展名OCX和DLL。实际上你可以把它们的扩暂名字调换。 COM作为ActiveX的更新技术,扩展名也有可能是DLL DLL文件还有可能是动态链接库。主要是装载一些函数,可以动态加载。

...全文
311 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗷嗷叫的老马 2010-07-24
  • 打赏
  • 举报
回复
挖坟的路过........
my13513480001 2010-02-14
  • 打赏
  • 举报
回复
【COM VS ACTIVEX】——占位
回家慢慢消化
zyh_nm 2009-07-23
  • 打赏
  • 举报
回复
学习中……
cyeaaa 2009-06-26
  • 打赏
  • 举报
回复
讲的好,学习了。
山书生 2009-06-20
  • 打赏
  • 举报
回复
好内容~起码,终于搞清楚了些关系:)
jackbeibei 2009-06-19
  • 打赏
  • 举报
回复
好东西 分享了
DreamFreeLancer 2009-06-19
  • 打赏
  • 举报
回复
西西误解我的意思了,我不是在Linux上开发COM组件,只是说COM思想影响了我的软件架构设计思想。
本人正在做一个开源项目:烽驿2009开源实时通信平台 源码获取:https://fy2009.googlecode.com/svn/trunk/ fy2009
了解该项目的设计思想可访问本人博克:http://blog.csdn.net/DreamFreeLancer
lk38092606 2009-06-19
  • 打赏
  • 举报
回复
来拿10分
caoxu1987728 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 caoxu1987728 的回复:]
引用 49 楼 clear_zero 的回复:
我是来学习的

[Quote=引用 试试]
[/Quote]
caoxu1987728 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 clear_zero 的回复:]
我是来学习的
[/Quote]
[Quote=引用 试试]
clear_zero 2009-06-19
  • 打赏
  • 举报
回复
我是来学习的
slowgrace 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 dreamfreelancer 的回复:]
毫不谦虚地说本人是COM高手,尽管已经从事Linux下通信软件开发多年。
同意2楼的说法,LZ对相关资料的理解比较浮,象是在做文字资料整理--当然,这是对社区的贡献,应该受到尊重。
同意3楼4楼的说法,COM在技术思想上绝对是.Net无法比拟的. .Net只能算是“工艺改进”,COM才算是“思想革命”。当然,COM也不是横空出世,但至于它爷爷的爷爷究竟是RPC还是CORBA或是别的,我想不必深究。
强烈认同楼上很多人说的:COM思想不灭。本人现在虽然在Linux下做软件,但勿庸讳言,本人的软件架构思想受COM影响深远,尽管我现在做的东东外行人看不出和COM有任何关系。另一个对本人产生过深刻影响的当属STL,那是另一个圣殿。
[/Quote]

谢谢分享。请问你在linux下用什么语言开发COM组件啊?
taotaoxs 2009-06-19
  • 打赏
  • 举报
回复
谢谢楼主!
caoxu1987728 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 chinadragon_1981 的回复:]
引用 20 楼 macky_1983 的回复:
路过 路过



路过 路过
 
[/Quote]

路过!
DreamFreeLancer 2009-06-18
  • 打赏
  • 举报
回复
毫不谦虚地说本人是COM高手,尽管已经从事Linux下通信软件开发多年。
同意2楼的说法,LZ对相关资料的理解比较浮,象是在做文字资料整理--当然,这是对社区的贡献,应该受到尊重。
同意3楼4楼的说法,COM在技术思想上绝对是.Net无法比拟的. .Net只能算是“工艺改进”,COM才算是“思想革命”。当然,COM也不是横空出世,但至于它爷爷的爷爷究竟是RPC还是CORBA或是别的,我想不必深究。
强烈认同楼上很多人说的:COM思想不灭。本人现在虽然在Linux下做软件,但勿庸讳言,本人的软件架构思想受COM影响深远,尽管我现在做的东东外行人看不出和COM有任何关系。另一个对本人产生过深刻影响的当属STL,那是另一个圣殿。
jipo777 2009-06-18
  • 打赏
  • 举报
回复
wo 要10分
clear_zero 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 slowgrace 的回复:]
呵呵。那是tigerzhao的笔误。全称是这个:Component Object Model
[/Quote]

这样啊,丢大人了

Model就是模式的问题,就可以从语言中抽象出来成为一中思维方式了
taotaoxs 2009-06-18
  • 打赏
  • 举报
回复
过来看看!
m60a1 2009-06-17
  • 打赏
  • 举报
回复
这个问题很老了,,我记得最早是02年,就有人提出了这个问题!
caoxu1987728 2009-06-17
  • 打赏
  • 举报
回复
课件大赛房价阿呆沙发大阿克苏的肌肤卡技术的看法快乐的发掘快乐的就罚款了啊看的发掘卡设计的考虑房间啊圣诞节疯狂垃圾收到付款了马赛克劳动纠纷卡门的啊但是看风景啊快递积分卡了解啊但是开发就快乐卡拉决定是否看啦时间的疯狂了
加载更多回复(41)

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧