动态链接库 / Dynamic Link Library


目录

  1. 动态链接库简介
  2. 函数封装DLL
  3. 组件对象模型COM
  4. 如何判断.dll文件是COM还是DLL
  5. 辅助工具

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"目录下。

一般来说,动态链接库可分为以下两种,

  1. 函数封装DLL,这是一种最常见的动态链接库文件,这种dll文件通常以函数集合的方式封装,对外以函数API的方式提供接口;
  2. 组件对象模型COM,是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。

2 函数封装DLL

这部分可参考链接

3 组件对象模型COM

3.1 关于COM

组件对象模型(Component Object Model, COM),是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。

由此带来的好处是多方面的,可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制,可以在多个应用系统中重复利用同一个组件,可以方便的将应用系统扩展到网络环境下,COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块,等等。

COM是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。开发自定义的COM组件就如同开发动态的,面向对象的API。多个COM对象可以连接起来形成应用程序或组件系统。并且组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换掉。Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。并且Microsoft的开发人员也大量使用COM组件来定制他们的应用程序及操作系统。

3.2 COMOLE/ActiveX关系

OLEActiveX

对象连接与嵌入(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。从体系结构角度讲,OLEActiveX是建立在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组件的注册,具体步骤如下,

  1. 开始菜单,输入cmd打开命令行工具;
  2. 使用命令regsvr32 + path进行注册,其中path为注册dll所在的文件完整路径及文件名(或cd到所在目录再进行注册);
  3. 若是64位COM,则先cd到syswow64目录下再进行注册。

Note:

  1. 可在cmd中输入regsvr32 /?来查看可选参数;
  2. 当提示报错码为0x80070005时,为系统权限不足,需要管理员方式运行cmd后,再进行注册即可成功;
  3. 当提示报错找不到注册入口DllRegisterServer,请确认是否为有效的ocx/dll,则说明该dll可能是函数封装的普通dll文件;
  4. 确保注册文件所在路径为全英文。

4 如何判断.dll文件COM还是DLL

当拿到一个.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 辅助工具 / Auxiliary Tools

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

Python的扩展接口[2] -> 动态链接库DLL[0] -> 动态链接库及辅助工具的更多相关文章

  1. Python的扩展接口[2] -> 动态链接库DLL[1] -> 组件对象模型 COM 的 Python 调用

    组件对象模型 COM 的 Python 调用 关于COM的基本概念,可参考组件对象模型 COM的内容,下面主要介绍两种使用 Python 调用 COM 组件的方法. 1 使用 win32com 1.1 ...

  2. 静态链接库(lib)、动态链接库(dll)与动态链接库的导入库(lib)

    静态链接库与动态链接库相对应.动态链接库的导入库不同于以上两种库. 1.静态链接库(lib)     程序编译一般需经编辑.编译.连接.加载和运行几个步骤.在我们的应用中,有一些公共代码是需要反复使用 ...

  3. Python的扩展接口[0] -> VISA仪器控制

    VISA仪器控制 / VISA Instrument Control 1 VISA简介 / VISA Introduction VISA(Virtual Instrument Software Arc ...

  4. Python的扩展接口[3] -> Matlab引擎 -> 使用 Python 调用 Matlab 程序

    Python - Matlab 目录 Python-Matlab 引擎 Python-Matlab 数组 Python-Matlab 基本操作 Python-Matlab 调用 m 文件 Matlab ...

  5. Python的扩展接口[1] -> 串口通信

    串口通信 / Serial Communication 1 串口简介 / Serial Introduction 串行接口(Serial Interface)简称串口,通常为COM接口,数据发送方式为 ...

  6. 接口自动化 [授客]基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

    基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0   by:授客 QQ:1033553122     博客:http://blog.sina.com.cn/ishou ...

  7. 基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

    基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0 目录 1. 开发环境2. 主要功能逻辑介绍3. 框架功能简介 4. 数据库的创建 5. 框架模块详细介绍6. Tes ...

  8. 纯python自研接口自动化脚本更新版本,让小白也能实现0到1万+的接口自动化用例

    查看完整文章点击原文链接:纯python自研接口自动化脚本更新版本,让小白也能实现0到1万+的接口自动化用例 你是否还在用postman\jmeter做接口自动化吗?用python的开源框架[unit ...

  9. 接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版]

    基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版]   by:授客 QQ:1033553122 由于篇幅问题,,暂且采用网盘分享的形式: 下载地址: [授客] ...

随机推荐

  1. 《Cracking the Coding Interview》——第7章:数学和概率论——题目1

    2014-03-20 01:57 题目:玩篮球投篮,有两种玩法:要么1投1中,要么3投两中.你单次投篮中的概率是p,那么对于不同的p,哪种玩法胜率更高? 解法:第一种总是胜率更高,可以列不等式算算,结 ...

  2. 利用binlog server及Xtrabackup备份集来恢复误删表(drop)

      Preface       Today I'm gonna test how to rescue a dropped table from binlog server based on a ful ...

  3. Python 两种方式实现斐波那契数列

    斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946 ...

  4. day-python入门3

    本节内容 鸡汤.电影 IDE介绍 知识回顾 数据类型 For循环 while循环 列表及常用操作 IDE介绍   IDE即集成开发环境        常见IDE   Visualstudio  : w ...

  5. golang中从一个日期开始往后增加一段时间

    废话少说上code, 这个是从当前日期开始,往后增加一个月时间 package main import ( "fmt" "time" ) func main() ...

  6. 《大道至简》第一章 编程的精义 java伪代码形式

    愚公.这位名家身上,浓缩了项目组织者.团队经理.编程人员.技术分析师等众多角色的优秀素质. 愚公移山事件分析: 原始需求:惩山北之塞,出入之迂 项目沟通方式:聚室而某曰 项目目标:毕力平险,指通豫南, ...

  7. Qt编程的一些技巧

    1.Qt程序在运行过程中,调用函数(如lcdNumber->display(num))显示数据到界面上时,并不会马上刷新屏幕显示,而是要等主程序运行到函数a.exec()时,才刷新屏幕,如下 因 ...

  8. DateBase -- Rising Temperature

    Question: Given a Weather table, write a SQL query to find all dates' Ids with higher temperature co ...

  9. [UOJ#131][BZOJ4199][NOI2015]品酒大会

    [UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...

  10. [bzoj] 2716 天使玩偶 || CDQ分治

    原题 已知n个点有天使玩偶,有m次操作: 操作1:想起来某个位置有一个天使玩偶 操作2:询问离当前点最近的天使玩偶的曼哈顿距离 显然的CDQ问题,三维分别为时间,x轴,y轴. 但是这道题的问题在于最近 ...