COM、DLL、ActiveX、OLE,CLR之间的区别

COM、DLL、ActiveX、OLE之间的区别

 

COM的最核心的思想,说白了就是要做个跨语言的 “class” “object” “function” 。

因为所有OOP语言,这三个都是核心,如果能做到这三个语言要素就可以跨语言,所有语言不都是可以互通了,程序员可以很用自己喜欢的语言编程了,这是目的。

COM是OO技术的巅峰之作,COM之后的OO都是COM的子集而已
COM的意图在于标准化OO组件的界面,使得

  1. 跨平台
  2. 跨语言
  3. 跨机器
  4. 跨进程

的分布式对象服务可以标准化,而且服务方可以被动态替换。COM的本质是一个分布式OO-RPC规范

COM的实现,为了跨语言,该怎么做呢?

1)肯定需要有种中立的,对语言里的类型系统的抽象,这就是type library,大家对别的语言的类型,不是直接去理解的,而是通过公共的类型来互相翻译。

2)类型必须要要有名字,我才能知道你说的是什么。而类型的名字没法跨语言,首先有些语言,比如c++,编译之后,根本不存类型的名字,其次这么多语言要求名字不重复,简直没法编程了,所以这就有了 class id,他是UUID,也就是说一个计算出来的名字,就像网卡mac一样,绝B不可能重复,你可以看看注册表里有很多“CLASSID”,就是这么来的。

3)我们真的那么需要类型跨语言吗?回想一下我们对class的使用,绝大多数时候,我们是不会访问成员的,而是通过function来访问类成员,所以我们的首要工作是研究怎么跨语言调用别的语言的function。特别是我们不会简单的调用一个function,我们会把功能相关的function组织起来,成为”一堆",这一堆function我们叫他interface,到这里,我们想到了,我们不会直接把class裸露的暴露给别的语言,我们只是暴露给别的语言以interface,当然函数调用的时候,参数也有类型,所以类型的跨语言也是必须的。

什么叫COM组件,说白了,就是一堆功能相关的interface,他是某种语言像另种语言暴露功能的最大单位。

4)COM组件并不需要名字,或者说不需要UUID,因为我们总是使用他里面的接口,而不是直接使用COM组件,所以接口也要UUID。说了这么多,COM架构这么复杂,肯定需要一个中间层,或者说摆渡人,这就是COM Library(一堆dll) + 注册表。A应用通知COM Library,并输入接口的UUID,由COM Library装入B应用的该组件对应的dll,并把接口指针返回给A应用,指针里指示的是一堆函数指针,由这些指针,可以调用到B应用里的函数功能。

 

        熟悉面向对象编程和网络编程的人一定对ActiveX、OLE和 COM/DCOM这些概念不会陌生,但是它们之间究竟是什么样的关系,对许多人还是比较模糊的。在具体介绍它们的关系之间,我们还是先明确组件(Component)和对象(Object)之间的区别。组件是一个可重用的模块,它是由一组处理过程、数据封装和用户接口组成的业务对象(Rules Object)。组件看起来像对象,但不符合对象的学术定义。它们的主要区别是:

1)组件可以在另一个称为容器(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用;
2)组件可以由一个类构成,也可以由多个类组成,或者是一个完整的应用程序;
3)组件为模块重用,而对象为代码重用。

        现在,比较流行的组件模型有COM(Component ObjectModule,对象组件模型)/DCOM( Distributed COM,分布式对象组件模型)和CORBA(Common Object Request BrokerArchitecture,公共对象请求代理体系结构)。

      从组件 与对象的区别说起,是想让大家明确COM和CORBA是处在整个体系结构的最底层,如果暂时对此还不能理解,不妨继续往下看,最后在回过头看一看就自然明白了。现在开始阐述ActiveX、OLE 和COM的关系。首先,让大家有一个总体的概念,从时间的角度讲,OLE是最早出现的,然后是COM和ActiveX;从体系结构角度讲,OLE和 ActiveX是建立在 COM之上的,所以COM是基础;单从名称角度讲,OLE、ActiveX是两个商标名称,而COM则是一个纯技术名词,这也是大家更多的听说 ActiveX和OL

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值