动态连接库 / Dynamic Link Libraryhtml
目录程序员
1 动态连接库简介 / DLL Introduction编程
动态连接库(Dynamic Link Library, DLL),是微软在Windows操做系统中,实现共享函数库概念的一种方式,在Windows下,这些库函数的扩展名能够是.dll/.ocx(ActiveX)/.drv(旧式系统驱动程序),在Linux系统中经常是.so文件。设计模式
动态连接提供了一种方法,使进程能够调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL文件中,该DLL包含一个或多个已被编译、连接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。浏览器
动态连接库文件,是一种不可执行的二进制程序文件,它容许程序共享执行特殊任务所必需的代码和其他资源。Windows提供的DLL文件中包含了容许基于Windows的程序在Windows环境下操做的许多函数和资源。通常被存放在电脑的"C:\Windows\System32"目录下。安全
通常来讲,动态连接库可分为如下两种,服务器
这部分可参考连接。编程语言
3.1 关于COM
组件对象模型(Component Object Model, COM),是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们能够开发出各类各样的功能专注的组件,而后将它们按照须要组合起来,构成复杂的应用系统。
由此带来的好处是多方面的,能够将系统中的组件用新的替换掉,以便随时进行系统的升级和定制,能够在多个应用系统中重复利用同一个组件,能够方便的将应用系统扩展到网络环境下,COM与语言,平台无关的特性使全部的程序员都可充分发挥本身的才智与专长编写组件模块,等等。
COM是开发软件组件的一种方法。组件其实是一些小的二进制可执行程序,它们能够给应用程序,操做系统以及其余组件提供服务。开发自定义的COM组件就如同开发动态的,面向对象的API。多个COM对象能够链接起来造成应用程序或组件系统。而且组件能够在运行时刻,在不被从新连接或编译应用程序的状况下被卸下或替换掉。Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而创建起来的。而且Microsoft的开发人员也大量使用COM组件来定制他们的应用程序及操做系统。
3.2 COM与OLE/ActiveX关系
OLE和ActiveX
对象链接与嵌入(Object Linking and Embedding, OLE),简称OLE技术,OLE是一种面向对象的技术,利用这种技术可开发可重复使用的软件组件(COM)。OLE不只是桌面应用程序集成,并且还定义和实现了一种容许应用程序做为软件“对象”(数据集合和操做数据的函数)彼此进行“链接”的机制,这种链接机制和协议称为组件对象模型(Component Object Model),简称COM。OLE能够用来建立复合文档,复合文档包含了建立于不一样源应用程序,有着不一样类型的数据,所以它能够把文字、声音、图像、表格、应用程序等组合在一块儿。
ActiveX是一个开放的集成平台,为开发人员,用户和 Web生产商提供了一个快速而简便的在 Interne和Intranet建立程序集成和内容的方法。使用ActiveX,可轻松方便的在Web页中插入多媒体效果、交互式对象、以及复杂程序,建立用户体验至关的高质量多媒体CD-ROM。其主要技术依旧是COM。
OLE/ActiveX/COM三者关系
参考百度百科的解释,
如今开始阐述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的第一个使用者倒是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则以提供进一步的网络应用与用户交互为主。
COM地位
到这里,你们应该对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的关系有了一个清楚的了解。
3.3 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.4 COM注册
使用命令行工具能够完成对COM组件的注册,具体步骤以下,
Note:
当拿到一个.dll文件时,如何对判断这是一个普通的DLL文件,仍是一个COM组件。通常状况下,文件类型是应该被告知的,但当不知道时,或许能够尝试如下几种方法进行判断。
1. 尝试注册dll文件,若注册成功则说明是COM(ActiveX/OLE),普通封装函数的DLL无需注册便可使用,在注册时会提示找不到注册入口;
2. 查看dll文件内部的函数(使用Depends等工具),若显示的接口函数为特定的五个函数,则基本属于COM(不排除某些普通DLL实现这些函数的可能):
1) DllMain:入口函数,完成一些Dll初始化工做(DirectShow实现的是DllEntryPoint);
2)DllGetClassObject: 用于得到类工厂指针;
3)DllCanUnloadNow: 系统空闲时会调用这个函数,以肯定是否能够卸载Dll;
4)DllRegisterServer: 将COM组件注册到注册表中;
5)DllUnregisterServer: 删除注册表中COM组件的注册信息。
5.1 Depends
Depends工具能够用来查看dll动态连接库文件,具体使用方法参考连接,
在Depends工具中主要界面区域以下,其中,
区域1: Dll的信息窗口,主要显示程序所需的Dll模块;
区域2: 所选的Dll模块所使用的函数,包括序数,提示,函数,入口点等信息;
区域3: 所选的Dll模块全部的导出函数,一样包括序数,提示,函数,入口点等信息;
区域4: 全部须要的Dll模块的属性,出错数据会以红色或黄色提示警告。
5.2 OleViewer
OleViewer能够用于查看当前电脑内安装的COM组件。
相关阅读
参考连接
http://bbs.csdn.net/topics/380080264
http://www.cnblogs.com/lihaozy/archive/2012/07/04/2576449.html