,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Windows应用程序与动态链接库,Windows应用程序与动态链接库,1,DLL简介,DLL,是一个可以执行的并可以被多个,Windows,应用程序共享的程序模块(称为,Module,),模块中包含了一些可以被多个,Windows,应用程序或,DLL,共享的代码、数据和资源。,动态连接库文件的扩展名一般是dll,也有可能是drv,sys和fon(它们分别对应的是设备驱动文件、系统文件和字体资源文件)。DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式.,DLL简介 DLL是一个可以执行的并可以被多个Win,2,DLL简介,DLL是Windows最重要的组成要素,Windows中的许多新功能、新特性都是通过DLL来实现的Windows本身就是由许多的DLL组成的,它最基本的三大组成模块Kernel、GDI和User都是DLL,它所有的库模块也都设计成DLL。,凡以.DLL、.DRV、.SYS和许多以.EXE为扩展名的系统文件都是DLL,打开WindowsSystem目录,就可以看到许多的DLL模块。,DLL简介 DLL是Windows最重要的组成要素,Wi,3,静态链接和动态链接,(1)静态链接,传统的库函数是通过静态链接链到应用程序中的。这些库函数可能来自编程语言提供的标准库,也可能是由操作系统提供的,API,。,静态链接和动态链接(1)静态链接,4,静态链接和动态链接,动态链接是指在把应用程序的目标代码链接成,EXE,文件时并没有将函数库中的函数复制到应用程序的可执行文件中,而是在程序运行时动态地加载所需的函数。,(2)动态链接,静态链接和动态链接 动态链接是指在把应用程序的目标,5,DLL特点,一个DLL在内存中只有一个实例,使之能高效经济地使用内存,降低可共享代码的内存使用量;,DLL实现的代码封装性,使得程序简洁明晰,提供给每个程序组一致的APIs让用户进行调用,在用户程序运行时被载入;,DLL的编制与具体的编程语言及编译器无关,只要遵守DLL的开发规范和编程策略,并安排正确的调用接口,不管用何种编程语言编制的DLL都具有通用性。,DLL特点一个DLL在内存中只有一个实例,使之能高效经济地使,6,创建DLL,创建带有输出原型/结构/符号的头文件,创建实现输出函数/变量的C/C+源文件,编译器为每个C/C+源文件生成.obj文件,链接程序结合.obj模块以生成DLL,如果至上有一个函数/变量输出,则链接程序同时也生成.lib文件,创建DLL创建带有输出原型/结构/符号的头文件,7,DLL的调用,隐式调用,隐式调用又称静态调用或装载时调用,对应于,DLL,的静态载入。要在应用程序中隐式调用某个动态链接库中的函数,一般要做以下两件事情:,(,1,)用,extern,子句声明要调用的过程或函数及其所在的,DLL,文件名;,(,2,)在应用程序中直接调用用,extern,子句声明的过程,DLL的调用隐式调用,8,DLL的调用,显示调用,定义一个与调用函数一致的函数类型;,用,LoadLibrary,或,SafeLoadLibrary,函数动态载入动态链接库;,用,GetProcAddress,得到要调用的函数或过程的地址;,利用定义的函数类型生成一个同类型的函数变量;,进行函数调用;,利用FreeLibrary函数卸载动态链接库。,DLL的调用显示调用,9,DLL的调用,显示调用,(只需获得DLL文件,并且知道要调用的函数名和参数),先用LoadLibrary加载dll,再用GetProcAddress检索所需的函数句柄,并且显式地用FreeLibrary卸载。,隐式调用,(需要.dll文件和生存的.lib库),应用程序链接前将.dll文件拷入应用程序的debug中,并将.lib文件引入。,DLL的调用显示调用(只需获得DLL文件,并且知道要调用的函,10,DLL的导入和导出,DLL包含一个导出函数表,函数表包含了函数在DLL,内的地址,可以通过函数的符号化名字和称为序号,的整数识别这些函数。客户程序首先装入DLL时并不,知道要调用的函数地址,但知道符号名或序号。动,态链接的进程建立一张表,把客户的调用和DLL里的,函数地址连结起来。,在DLL代码中,必须显示声明导出函数:,_declspec(dllexport)void Func(char,DWORD),应用程序方面需要声明对应的导入函数:,_declspec(dllimport)void Func(char,DWORD),DLL的导入和导出DLL包含一个导出函数表,函数表包含了函数,11,DLL函数的入口地址,BOOL WINAPI DllMain,/,函数名DllMain是区分大小写的,(HANDLE hinstDll,/,包含了DLL的实例句柄,DWORD fdwReason,/,系统调用该函数的原因,LPVOID lpReserved)/,0表示显示链接,非0表示隐式,DLL函数的入口地址BOOL WINAPI DllMain,12,示例:编写一个简单的DLL模块并在用户程序中进行调用,示例:编写一个简单的DLL模块并在用户程序中进行调用,13,示例运行结果:,示例运行结果:,14,Windows应用程序与动态链接库课件,15,实验四,创建一个DLL模块实现两个正整数的相加功能,创建一个应用程序调用该DLL模块,实验四创建一个DLL模块实现两个正整数的相加功能,创建一个,16,