COM和DLL的区别

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的知识如果要讲起来的话那可是长篇累牍,可以看看相关的书籍。

autocad开发时为什么要利用com,而不采用一般的dll呢?
用com来写程序要比普通的dll麻烦一些,但是带来的好处也大很多,尤其是在开发像autocad这样大型软件的时候,需要跨区域来协同工作。
MS提供了各式各样的可扩展的COM服务,COM编程接口。
大家也没有必要通晓这些接口,就象对待大量的WIN API的态度,用到时再查帮助。

**COM的各种努力都是在规定了一种二进制交互的协议。**说起来简单,做起来相当复杂,要使使用不同语言编写的客户能够使用任意语言编写的服务程序谈何容易!这里说语言还是把问题简单化了,因为每种语言还有各式各样的编译器,不同编译器出来的二进制代码如何交互?
就拿DLL来说,DLL是对静态连接的一种改进,带来了更细的开发分工,也带来了很多问题,其中就有二进制如何交互的问题。这个问题当DLL输出类时更加突出。COM为解决此问题提出了极负创意的解决方案,不仅如此,更进一步引申,提出了如何跨 网络的交互。然后,针对internet服务器的开发提出COM+。COM体系中融合了多种经典的设计模式,可以说是一种更加精干的C++。

1、COM组件以接口对功能分类,便于组织;DLL特别是大的DLL,函数一大堆,难以组织;
2、COM组件便于升级维护,功能扩充,只需添加接口就行;DLL升级困难,函数不能随意改变;
3、COM创建调用有很好的安全性,DLL没有;
4、COM组件可轻松实现进程间调用,DLL很困难;
5、COM组件可轻松实现分布式调用,DLL不可能;
6、COM组件具有封装、继承、多态的面向对象特征,DLL只有封装;
7、在COM组件的基础上实现了大量功能:ActiveX,OLE等;

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值