Com组件和Dll文件区别

[转]COM组件和DLL的区别

2014-8-14阅读169 评论0程序员

com英文为Component Object Model(组件对象模型),是微软生产软件组件的标准。面试

它是构造二进制兼容软件组件的规范,无论组件应用何种语言编写只要遵循com规范就能够相互直接通讯。提出com规范主要是为了知足:编程

1.程序的快速开发,能够将一个大型的工程分红若干个com组件同时开发。小程序

2.能够动态的插入或卸载com组件。设计模式

3.能够隐藏或封装com组件内部的实现细节。浏览器

com组件能够由不一样的语言进行编写,但com组件之间的通讯是经过组件的接口来实现的,com组件接口的实现是统一的,它采用的是虚拟函数表(VTBL)形式。虚拟函数表中包含了组件函数的一组指针,咱们能够经过这组指针来获取咱们想要通讯的组件函数的内存地址。dll(动态连接库)是包含函数和数据的模块的集合。它能够导出数据也能够导出函数以供其它的dll调用。dll的加载能够经过静态连接和动态连接两种方式。安全

1.静态连接时将所要连接的dll模块以二进制的形式编译进其余模块。服务器

2.动态连接指调用模块在运行时加载DLL,使用LoadLibrary函数或LoadLibraryEx函数将dll加载到进程的地址空间,并调用GetProcAddress函数以获取导出的 DLL函数的地址。网络

动态加载dll的优势:框架

1.DLL可节省内存并减小交换。经过在内存中共享 DLL的单个副本,多个进程能够同时使用一个DLL。相比之下,对于使用静态连接库构建的每个应用程序,Windows 都要在内存中为其加载库代码的一个副本。

2.DLL 可节省磁盘空间。 多个应用程序能够共享磁盘上的一个 DLL副本。相比之下,使用静态 连接库构建的每个应用程序都须要让连接到程序文件映像的库代码做为一个单独的专用副本。

dll与com的关系:com是一种规范,按照是com规范实现的dll能够被视为com组件,

例如咱们用mfc创建的Active X控件工程其中的接口封装是靠idl描述的因此能够视为com组件。并且从上面关于com和dll的说明能够看出com组件的接口是一组具备特定规范的函数,因此com组件能够别视为dll但dll不必定是com组件。

com和DLL最大的区别就是: dll是以函数集合的方式来调用的是编程语言相关的象VC必须加上extern "C"...而COM是以interface的方式提供给用户使用的是一种二进制的调用规范,是与编程语言无关的,它使用idl接口定义语言来描述本身使用类继承来实现本身的功能和方法.DLL只有DLL一种形势,里面可任意定义函数无限制,只能运行在本机上而COM有DLL和EXE两种存在形势: COM所在的DLL中必须导出四个函数:

dllgetobjectclass,dllregisterserver, dllunregisterserver,dllunloadnow这四个函数各有做用,有些是提供给COM管理器用的,经过CLSID和IID来使用,有些是提供给注册机用的.COM结合MTS,就是COM+, 是DCOM的高级版本,提供了更为强大和安全的分布式COM服务,DCOM运行在不一样的机器上 用proxy和stub来实现远程接口的本地映射 两者从执行速度来讲 两者相差无几 可是启动速度DLL要比COM快!

我想你应该知道类库和框架(最典型的就是MFC)的概念,它们是提供源代码级复用的,也就是说类库是以源代码的形式分发的,类库的使用者(好比使用MFC开发应用程序的咱们)要把实现代码加入到他们的工程中去,而后编译连接,这时候类库中的源代码就成为了你的应用程序中的一部分,未来若是要是类库的设计者从新修改了他们的类库,那么你的应用程序就须要从新编译连接你的应用程序,这对于已经到了最终用户手中的你的应用程序的升级很麻烦,并且一个最终用户的机子上有可能有不少个程序使用了同一个类库当中的相同类的话就会出现一些多余的代码!   
          这就须要提供一种机制来解决上面的问题,把你的可重用的代码作成一个Dll的形式包装起来是一个可行的方法,在这个Dll中导出一些你须要提供给第三方使用的类、全局函数、数据等,这样你就能够在最终用户的机器上保持一份你的Dll,其它应用程序经过调用你Dll中的引出函数就能够实现代码共享,这样若是你之后升级了你的Dll(保持接口不变),最终用户只要获得这个新的Dll覆盖掉原先的那个旧Dll不用更改任何东西就可使他机子上的程序保持最新了,并且因为代码只有一份,在运行时使用的空间也比使用类库开发的程序来得少。   
          可是上面这种使用Dll的方案仍是有缺陷的,因为每一个编译器都会加入它本身的一些独特的语言特征。好比Dll我是使用Visual   C++开发的,里面有异常处理的代码,如今我在Borland   C++中使用这个Dll,那么它将没法捕捉到这些异常;再举个例子,若是这个Dll导出了一个类,而这个类在新的Dll中增长了一些成员变量(也就是说这个类的对象占用的内存增长了),那么在最终用户机子上的原先使用旧的Dll而改用了新的Dll的应用程序若是没有从新编译连接的话会产生非法操做,由于C++的编译模型要求应用程序在编译的时候就须要知道对象占用的空间,原先使用了旧的Dll的应用程序因为没有通过从新编译连接,它所认得的仍是原先Dll中的类的对象的大小,最终用户机子换成了新的Dll后,那个旧的应用程序当访问这些新的成员变量的时候就会产生越界非法操做。其实Dll还有其它许多缺陷的!   
          根据这些,咱们须要更好的重用机制(在二进制级别的),在Windows下,大量用到的非COM所属了。其基本的思想就是它实现了真正的接口与代码实现的分离,并且它是与语言无关的。COM分为进程内组件(编译连接成Dll或者Ocx文件,本质上同样,一个无界面另外一个有界面)和进程外组件(编译连接成Exe文件),这些组件会提供一些接口供第三方调用。其它有关COM的知识若是要讲起来的话那但是长篇累牍,能够看看相关的书籍。

 

这阵子在想一个须要利用com组件的小程序怎么作,忽然想起上次去面试的时候考官问过autocad开发时为何要利用com,而不采用通常的dll呢?     到google上查了一下,许多人也问了同样的问题:)     用com来写程序要比普通的dll麻烦一些,可是带来的好处也大不少,尤为是在开发像autocad这样大型软件的时候,须要跨区域来协同工做。 “学习COM,首先要知道COM的目的是什么,它解决了一个什么样的问题,在此基础上,MS提供了各式各样的可扩展的COM服务,COM编程接口。这些服务和接口恐怕一个程序员一生都不可能通晓,由于发展是如此之快。你们也没有必要通晓这些接口,就象对待大量的WIN   API的态度,用到时再查帮助。   

 COM的各类努力都是在规定了一种二进制交互的协议。提及来简单,作起来至关复杂,要使使用不一样语言编写的客户可以使用任意语言编写的服务程序谈何容易!这里说语言仍是把问题简单化了,由于每种语言还有各式各样的编译器,不一样编译器出来的二进制代码如何交互?   
  就拿DLL来讲,DLL是对静态链接的一种改进,带来了更细的开发分工,也带来了不少问题,其中就有二进制如何交互的问题。这个问题当DLL输出类时更加突出。COM为解决此问题提出了极负创意的解决方案,不只如此,更进一步引伸,提出了如何跨 网络的交互。而后,针对internet服务器的开发提出COM+。COM体系中融合了多种经典的设计模式,能够说是一种更加精干的C++。   
    
 COM博大精深,若干大师仍须半年的mental   fog,   方能有豁然开朗之时。咱们这些晚辈,还需多加修炼才对,但决不止是COM“   

一、COM组件以接口对功能分类,便于组织;DLL特别是大的DLL,函数一大堆,难以组织;

二、COM组件便于升级维护,功能扩充,只需添加接口就行;DLL升级困难,函数不能随意改变;

三、COM建立调用有很好的安全性,DLL没有;

四、COM组件可轻松实现进程间调用,DLL很困难;

五、COM组件可轻松实现分布式调用,DLL不可能;

六、COM组件具备封装、继承、多态的面向对象特征,DLL只有封装;

七、在COM组件的基础上实现了大量功能:ActiveX,OLE等;

Activex、OLE、COM、OCX、DLL之间的区别

熟悉面向对象编程和网络编程的人必定对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文件还有多是动态连接库。主要是装载一些函数,能够动态加载。
com的前景 
之后一种比较理想的应用程序模式就是Web化(条件是网络速度足够快),将来的软件应该不存在客户应用软件的说法了,客户就只有浏览器,浏览器就是操做系统,客户一边下载一边使用,固然下载的都是一个个功能独立的模块。而这些功能独立的模块就是com组件,通常的dll是不能这么用的。
相关文章
相关标签/搜索