首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

(一)与lwj问答 之 DLL那些事

2013-03-28 
(1)与lwj问答 之 DLL那些事一、概念DLL:Dynamic Link Library,即动态链接库,这种库包含了可由多个程序同时

(1)与lwj问答 之 DLL那些事
一、概念

DLL:Dynamic Link Library,即动态链接库,这种库包含了可由多个程序同时使用的代码和数据。

它是microsoft在windows操作系统中实现共享函数库概念的一种实现方式。其中windows中 一些作为DLL实现的文件有:

ActiveX控件(.ocx)文件:如windows上的日历控件。控制面板(.cpl)文件:控制面板中的每一项都是一个专用的DLL。设备驱动程序(.drv)文件:如控制打印到打印机的打印机驱动程序。

二、由来

DLL最初用于节约应用程序所需要的磁盘和内存空间。早前,在传统的非共享库中,一部分代码简单地附加到调用的程序中。如果两个程序同时调用同一个子程序,就会出现两份那段代码。相反,许多应用共享的代码能够切分到一个DLL中,在硬盘上存为一个文档,在内存中只需使用一个实例。

(一)与lwj问答 之 DLL那些事

三、DLL的优缺点

优点

(1)节省内存和代码重用:当多个程序使用同一个函数库时,DLL可以减少在磁盘和物理内存中加载代码的重复量,且有助于代码的重用。

(2)模块化:DLL有助于促进模块式程序开发。模块化允许仅仅更改几个应用程序共享使用的一个DLL中的代码和数据而不需要更改应用程序自身。这种模块话的基本形式允许如Microsoft Office、Microsoft Visual Studio、甚至windows自身这样大的应用程序 使用较为紧凑的补丁和服务包。

缺点

DLL Hell:即DLL地狱,指几个应用程序在使用同一个共享的DLL库时发生版本冲突。

究其原因,八个字:成也共用,败也共用。因为DLL Hell正是由于动态链接库可与其他程序共用函数、资源所导致。

主要有两种情况

设想这样一个场景:程序A会使用1.0版本的动态链接库X,则在程序A安装到系统时,会同时安装该1.0版本的动态链接库X。假设另一个程序B也会使用到动态链接库X,那么程序B直接复制到硬盘中即可正常运行,因为动态链接库已经存在于系统中。然而有一天,另一程序C也要使用动态链接库X,但是由于程序C开发的时间较晚,其需要较新版本---2.0版本的动态链接库X。则在程序C被安装到系统时,2.0版本的动态链接库X 也必须随之安装到系统中,此时系统中1.0版本的动态链接库将被2.0版本所取代(替换)。

情况1:新版本的动态链接库不兼容旧版本。如,A何B需要X所提供的功能,在升级到2.0后,新版本的X竟然把此功能取消了(很难想象吧,呵呵但有时候就是如此....)。则此时虽然C能正常运行,但A和B均无法工作了。

情况2:新版本的动态链接库兼容旧版本,但是存在一个bug。

可看下面的例子(仅仅为了说明问题):



四、DLL与lib的关系

咋一看:lib是静态链接库;DLL是动态链接库,一个编译时提供;一个运行时提供,完了。

其实没那么简单! lib也有静态lib和动态lib之分。

静态lib:它将导出声明(后面会讲)和实现均放到lib中,编译后所有代码都嵌入到宿主程序中去。

动态lib:相当于一个h文件,它是对实现部分(.DLL)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时需要相应的DLL文件的支持,否则无法工作。当生成一个新的DLL时,也会有配套的lib产生(即二者需一起分发),此时的lib即为动态lib(后面会有还有实验)。

五、如何生成一个DLL

在VC++6.0开发环境下,打开File\New\Project选项,可以选择Win32 Dynamic-Link Library或MFC AppWizard【dll】来以不同的方式创建Non-MFC DLL、Regular DLL、Extension DLL等不同种类的动态链接库。下面以选择Win32 Dynamic-Link Library方式来创建一个DLL(实现加法运算):

1、创建一个Win32 Dynamic-Link Library方式的空工程,取名为myDLL

(一)与lwj问答 之 DLL那些事

2、分别添加头文件(.h)和源文件(.cpp)

六、如何调用一个DLL

下面实现两种调用方式:单独.dll 和.h + .lib + .dll结合

需把对应的 .dll 文件以及.lib 文件和.h文件(结合方式时)拷贝至调用的程序目录下

(1)单纯使用.dll


(2).h + .lib + .dll 结合方式


反例演示:此时如果去掉 .dll 文件(即只有.lib 和 .h文件),则会出错:

(一)与lwj问答 之 DLL那些事


参考文献:

(1)维基百科之动态链接库

(2)msdn之什么是DLL?

(3)维基百科之DLL地狱

(4)别再掉进DLL地狱的陷阱里(DLL Hell)....

(5)什么是 Side-by-side Assembly

(6)dll的两种调用方式,lib 与 dll 的区别

(7)C++ DLL 编写入门

热点排行