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