com组件能实现哪些普通DLL实现不了的功能?

52pojie 发布于 2015/02/28 04:00
阅读 2K+
收藏 0
加载中
1
RADG
RADG

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快%

2
wwwjjj
wwwjjj

纯粹讲功能来说 ,没有什么是com能实现而普通dll实现不了的。

但com相比较dll  我个人觉得有两点

1 调用方面

com会在操作系统中注册  注册完毕后  通过com的classid或者组件名   所有的软件就都能够调用com组件,而不需要关心这个com的实际文件路径,系统中只需要一份dll文件,不管这个com实际文件名是什么,只要classid和组件类名一致,都可以继续调用,操作系统帮你做了统一登记和管理。

普通dll文件的毛病在于, 首先你必须知道文件名并只能通过文件名调用,其次如果你不想使用绝对路径而且还想让别的程序能够轻松调到,那除非是放到system32目录下,这毕竟是操作系统目录,文件也不能改名,作为一个调用程序,无法很简便地知道硬盘上到底有没有需要的dll,而且文件名就算一致,文件也不见得就是正确的文件,而且硬盘上就会出现很多同样作用的dll,需要开发者处理的事情一下子增加了很多,这就不如com的注册机制,只要提供标识我就能使用相应的com组件,如果系统中没注册我就注册一下。

2 安全方面

windows在操作系统这个层面对com组件的调用和运行提供了一些控制功能,

例如限定com只能在桌面环境下调用和执行,只通过特定用户角色权限执行等等。

具体可以开始菜单---运行--dcomcnfg.exe 。


返回顶部
顶部