windowsapi编程之动态链接库(dll)
- 格式:doc
- 大小:14.03 KB
- 文档页数:4
Windows动态链接库DLL使⽤⼀、概念DLL:Dynamic Link Library,即动态链接库,这种库包含了可由多个程序同时使⽤的代码和数据。
它是microsoft在windows操作系统中实现共享函数库概念的⼀种实现⽅式。
其中windows中⼀些作为DLL实现的⽂件有:ActiveX控件(.ocx)⽂件:如windows上的⽇历控件。
控制⾯板(.cpl)⽂件:控制⾯板中的每⼀项都是⼀个专⽤的DLL。
设备驱动程序(.drv)⽂件:如控制打印到打印机的打印机驱动程序。
⼆、由来DLL最初⽤于节约应⽤程序所需要的磁盘和内存空间。
早前,在传统的⾮共享库中,⼀部分代码简单地附加到调⽤的程序中。
如果两个程序同时调⽤同⼀个⼦程序,就会出现两份那段代码。
相反,许多应⽤共享的代码能够切分到⼀个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直接复制到硬盘中即可正常运⾏,因为动态链接库已经存在于系统中。
Windows Dynamic-Link Library1.概论先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。
但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库,我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。
譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL 中。
kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。
由此可见DLL对我们来说其实并不陌生。
(3)VC动态链接库的分类Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL (MFC扩展DLL)。
dll原理DLL原理动态链接库(Dynamic Link Library,简称DLL)是一种Windows 操作系统中常用的库文件,它可以被多个应用程序共享使用,从而避免了重复编写相同的代码。
本文将详细介绍DLL的原理。
一、静态链接与动态链接在介绍DLL原理之前,先来了解一下静态链接和动态链接。
1. 静态链接静态链接是指将程序所需要的库文件在编译时全部打包进可执行文件中。
这样做的好处是程序运行时不需要再加载外部库文件,因此速度较快。
但缺点也很明显,即可执行文件体积较大,在多个程序中使用相同的库时会造成重复浪费。
2. 动态链接动态链接是指在程序运行时才加载所需的库文件。
这样做的好处是节省了内存空间,并且多个程序可以共享同一个库文件。
但缺点也很明显,即运行速度较慢。
二、DLL概述1. DLL定义DLL是一个包含可由多个程序同时使用的代码和数据的库文件。
它可以被多个应用程序共享使用,从而避免了重复编写相同的代码。
2. DLL分类根据DLL所包含函数是否可以被其他应用程序调用,DLL可以分为两种类型:(1)导出函数的DLL导出函数的DLL是指将其中一些函数导出,以便其他应用程序可以调用这些函数。
这种DLL文件通常包含一组API(Application Programming Interface,应用程序编程接口)函数。
(2)内部使用的DLL内部使用的DLL是指不导出任何函数,只供当前进程中的其他模块使用。
这种DLL文件通常包含一些共享数据和实现某些功能的代码。
三、DLL加载过程1. 加载方式当一个应用程序需要调用一个DLL中的函数时,Windows操作系统会自动加载该DLL。
Windows操作系统有两种加载方式:(1)显式链接显式链接是指在编译时就将要使用的DLL文件名和需要调用的函数名写入源代码中,并在程序运行时由操作系统自动加载该DLL文件。
(2)隐式链接隐式链接是指在编译时不将要使用的DLL文件名和需要调用的函数名写入源代码中,而是在程序运行时由操作系统自动搜索并加载相应的DLL文件。
dll的创建和使用使用C++语言创建dll并使用该dll的演示、说明Dll的创建和使用第一部分创建C风格的dll (4)步骤1:创建dll工程 (4)步骤2:文件改名 (5)步骤3:拷贝文件内容 (6)步骤4:从工程中删掉文件main.cpp,main.h (7)步骤5:继续修改文件mydll.h和mydll.cpp (7)步骤6:编译并生成dll文件 (8)第二部分以间接调用的方式使用.dll (10)步骤1:新建一个控制台工程(UseDll.cbp). (10)步骤2:修改main.cpp。
(11)步骤3:编译,生成UseDll.exe (12)步骤4:拷贝mydll.dll到UseDll.exe所在目录 (13)步骤5:执行UseDll.exe,输出: (13)间接调用Dll的好处 (14)第三部分以直接调用的方式使用.dll (15)步骤1:改写main.cpp (15)步骤2:添加mydll.dll的静态导出库到UseDll工程中 (16)步骤3:编译并执行,输出 (17)直接调用的好处 (18)Dll的优势 (18)调用约定的说明 (18)第四部分创建C++风格的dll(本地方法) (19)步骤1:在mydll.h中新增导出的类 (19)步骤2:在mydll.cpp中实现Cat类 (19)步骤3:编译MyDll,生成mydll.dll,mydll.a (21)第五部分使用本地风格的C++ DLL (22)步骤1:修改UseDll中的main.cpp (22)步骤2:将mydll.a添加到UseDll工程的BuildOptions中 (23)步骤3:编译UseDll工程,生成UseDll.exe (23)步骤4:将MyDll.dll拷贝到UseDll.exe目录下 (23)步骤5:执行UseDll.exe,输出 (23)本地风格的不足 (24)第六部分创建推荐风格的C++ DLL (26)步骤1:修改mydll.h,创建Cat的接口类ICat (26)步骤2:新建类Cat (27)步骤3:实现createCat函数 (29)步骤4:编译,生成mydll.dll (31)第七部分使用推荐风格的C++ DLL (32)步骤1:修改UseDll中的main.cpp (32)步骤2:将第六部分生成的libmydll.a添加到UseDll的BuildOptions中 (33)步骤3:编译UseDll工程,生成useDll.exe (34)步骤4:将第六部分生成的mydll.dll拷贝到UseDll.exe所在文件目录 (34)步骤5:执行,输出 (35)推荐风格的好处: (35)第一部分创建C风格的dll下面以CodeBlocks为例演示说明创建和使用dll,其它开发环境类似步骤1:创建dll工程创建dll工程MyDll.cpp步骤2:文件改名新建两个文件mydll.h和mydll.cpp步骤3:拷贝文件内容将main.h中的核心内容拷贝到mydll.h中再将main.cpp中的部分内容拷贝到mydll.cpp中,并更改include文件名。
Windows系统平台提供了一种有效的编程和运行环境,可以把独立的程序模块创建成为较小的DLL(Dynamic Linkable Library,动态链接库)文件,并可对它们单独编译和测试. Windows操作系统的核心功能、系统服务、应用程序服务等多数是由一组动态链接库是实现的。
使用动态链接库有很多优点,在运行时,只有当EXE程序确实要调用这些DLL 模块的情况下,系统才会将它们装载到内存空间中,这种方式不仅减少了EXE 文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。
而且当动态链接库中的函数改变后,只要不是参数改变,调用这个函数的应用程序并不需要重新编译,这在编程时是十分有用的。
通过本章的学习,读者会了解DLL的基本概念、能够使用VC实现几种类型的DLL的开发与调用操作。
DLL的基本知识在程序开发中,比较大的应用程序,往往被划分为很多模块,这些模块以二进制的方式提供,并能完成相对独立的功能。
其中一些比较通用的模块,在构造其他软件系统时,也经常用到,就把这些模块汇集起来,形成“仓库”。
而动态链接库(DLL)就可以看成一种“仓库”,提供可以直接使用的变量、函数或类。
在开发和调用DLL之前,有必要了解一下动态链接库的相关概念。
只有了解了动态链接库的结构和共走机制,才能灵活有效地开发和使用它。
1.1DLL与LIB•与动态链接库(DLL)相对应的是静态链接库(LIB文件),其相似之处是它们都是将一部分可执行代码以及数据放在库中供用户程序使用,而且在使用时,这些代码就像是用户程序本身的一部分。
而二者的主要区别就是在使用方法上。
使用静态链接库的应用程序从函数库(LIB)得到所引用的函数的执行代码,然后把执行代码放进自身的执行文件中,这样,应用程序在运行时就可以不再需要静态函数库的支持。
•使用动态链接库的应用程序只包括了用于从DLL中定位所引用的函数的信息。
而没有函数具体的实现,要等到程序运行时才从DLL中获得函数的实现代码。
Windows API编程之动态链接库(DLL)
本文总结Windows API编程之动态链接库(DLL),内容涉及DLL的制作、发布、使用及相关技术以供大家参考。
作者:tyc611,2007-05-26 链接库分为静态链接库和动态链接库,而动态链接库在使用时,又进一步分为装载时链接和运行时链接。
装载时链接是指该动态链接库是在程序装入时进行加载链接的,而运行时链接是指该动态链接库是在程序运行时执行LoadLibrary(或LoadLibraryEx,下同)函数动态加载的。
因此,由于动态链接库有这两种链接方式,所以在编写使用DLL的程序时,就有了两种可选方案。
可能有人会问“为什么需要装载时链接?直接静态链接
不就行了吗?”,这是模块化程序设计的需要。
试想,如果你开发一个很大的程序,并且经常需要更新。
如果你选择静态链接,那么每次更新就必须更新整个exe文件,而如果你把需要经常更新的模块做成dll,那么只需要更新这个文件即可,每次程序运行时加载这个更新的文件即可。
在进入编写DLL程序之前,先介绍一些相关知识。
VC支持三种DLL,它们分别是Non-MFC DLL、MFC Regular DLL、MFC Extension DLL。
由于本文只讲解API
编程,所以这里只对第一种DLL进行介绍,后面两种DLL
将在另外的文章中介绍。
动态链接库的标准后缀是.DLL,当然也可以使用其它任意后缀名。
但使用.DLL后缀的好处是:一是,很直观表明该文件的性质;二是,只有后缀为.DLL的动态链接库才能被Windows自动地加载,而其它后缀的动态链接库只能通过LoadLibrary显示式加载。
动态链接库的用途:一是作为动态函数库使用,另一个常用的方式是作为动态资源库。
当然,没有绝对的划分,比如你的动态函数库时也可能有资源,但动态资源库一般不会有函数。
另两个重要的、需要区分的概念是:对象库(Object Library)和导入库(Import Library)。
对象库是指普通的库文件,比如C运行时库libc.lib;而导入库是一种比较特殊的对象库文件,与一个动态链接库相对应。
它们都有后缀.lib,并且都仅在程序编译链接时使用,被链接器用来解析函数调用。
然而,导入库不包含代码,它只为链接器提供动态链接库的信息,以便于链接器对动态链接库中的对象作恰当地链接。
动态链接库的查找规则。
如果在使用时没有指定动态链接库的路径,则Windows系统按如下顺序搜索该动态链接库:使用该动态链接库的.exe文件所在目录、当前目录、Windows系统目录、Windows目录、环境变量%PATH%中的路径下的目录。
DLL内的函数划分为两种类型:(1)导出函数,可供应用程序调用;(2)内部函数(普通函数),只能在DLL程序内使用,应用程序无法调用它们。
同样的划分适用于数据对象。
在DLL中,要导出某个对象(函数或者数据),声明方式有两种:一种是利用关键字__declspec(dllexport);另一种方式是采用模块定义文件(.def)。
另外,还可以通过链接选项/EXPORT指定导出。
应该优先选用第一种方式,但.def
文件方式在某些情况下是必须的。
下面,我们分别介绍动态链接库的的制作、发布、使用及相关技术,重点介绍装载时链接和运行时链接的使用方法。
在介绍运行时链接时,引入了模块定义文件(.def),详细介绍了其在DLL制作过程中的作用及使用方法。
另外,还介绍了DLL中全局变量的导出、DLL中的数据共享和资源DLL
的制作及使用。
动态链接库的制作及装载时链接
首先,打开VC6.0,创建一个名为DLLTest的空工作区。
然后,创建一个名为DLL_Lib的Win32 Dynamic-Link Library工程,注意将该工程添加到刚创建的工作区DLLTest 中,并且将该工程保存在工作区的目录下(不建子目录)。
然后,在该工程中,加入这下面两个文件:/*
* dll_lib.h
*/
#ifndef DLL_LIB_H
#define DLL_LIB_H#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endifEXPORT int WINAPI GetMax(int a, int b);#endif。