Windows应用程序与动态链接库2.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows应用程序与动态链接库 DLL简介 DLL是一个可以执行的并可以被多个Windows应用程序共享的程序模块(称为Module),模块中包含了一些可以被多个Windows应用程序或DLL共享的代码、数据和资源。 动态连接库文件的扩展名一般是dll,也有可能是drv,sys和fon(它们分别对应的是设备驱动文件、系统文件和字体资源文件)。 DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式. DLL简介 DLL是Windows最重要的组成要素,Windows中的许多新功能、新特性都是通过DLL来实现的Windows本身就是由许多的DLL组成的,它最基本的三大组成模块Kernel、GDI和User都是DLL,它所有的库模块也都设计成DLL。 凡以 .DLL、.DRV、.SYS和许多以 .EXE为扩展名的系统文件都是DLL,打开Windows\System目录,就可以看到许多的DLL模块。 静态链接和动态链接 (1)静态链接 传统的库函数是通过静态链接链到应用程序中的。这些库函数可能来自编程语言提供的标准库,也可能是由操作系统提供的API。 静态链接和动态链接 动态链接是指在把应用程序的目标代码链接成EXE文件时并没有将函数库中的函数复制到应用程序的可执行文件中,而是在程序运行时动态地加载所需的函数。 DLL特点 一个DLL在内存中只有一个实例,使之能高效经济地使用内存,降低可共享代码的内存使用量; DLL实现的代码封装性,使得程序简洁明晰,提供给每个程序组一致的APIs让用户进行调用,在用户程序运行时被载入; DLL的编制与具体的编程语言及编译器无关,只要遵守DLL的开发规范和编程策略,并安排正确的调用接口,不管用何种编程语言编制的DLL都具有通用性。 创建DLL 创建带有输出原型/结构/符号的头文件 创建实现输出函数/变量的C/C++源文件 编译器为每个C/C++源文件生成.obj文件 链接程序结合.obj模块以生成DLL 如果至上有一个函数/变量输出,则链接程序同时也生成.lib文件 DLL的调用 隐式调用 隐式调用又称静态调用或装载时调用,对应于DLL的静态载入。要在应用程序中隐式调用某个动态链接库中的函数,一般要做以下两件事情: (1)用extern子句声明要调用的过程或函数及其所在的DLL文件名; (2)在应用程序中直接调用用extern子句声明的过程 DLL的调用 显示调用 定义一个与调用函数一致的函数类型; 用LoadLibrary或SafeLoadLibrary函数动态载入动态链接库; 用GetProcAddress得到要调用的函数或过程的地址; 利用定义的函数类型生成一个同类型的函数变量; 进行函数调用; 利用FreeLibrary函数卸载动态链接库。 DLL的调用 显示调用(只需获得DLL文件,并且知道要调用的函数名和参数) 先用LoadLibrary加载dll,再用GetProcAddress检索所需的函数句柄,并且显式地用FreeLibrary卸载。 隐式调用(需要.dll文件和生存的.lib库) 应用程序链接前将.dll文件拷入应用程序的debug中,并将.lib文件引入。 DLL的导入和导出 DLL包含一个导出函数表,函数表包含了函数在DLL 内的地址,可以通过函数的符号化名字和称为序号 的整数识别这些函数。客户程序首先装入DLL时并不 知道要调用的函数地址,但知道符号名或序号。动 态链接的进程建立一张表,把客户的调用和DLL里的 函数地址连结起来。 在DLL代码中,必须显示声明导出函数: _declspec(dllexport) void Func(char[],DWORD) 应用程序方面需要声明对应的导入函数: _declspec(dllimport) void Func(char[],DWORD) DLL函数的入口地址 BOOL WINAPI DllMain //函数名DllMain是区分大小写的 (HANDLE hinstDll, //包含了DLL的实例句柄 DWORD fdwReason, //系统调用该函数的原因 LPVOID lpReserved) //0表示显示链接,非0表示隐式 示例:编写一个简单的DLL模块并在用户程序中进行调用 示例运行结果: 实验四 创建一个DLL模块实现两个正整数的相加功能,创建一个应用程序调用该DLL模块 * * (2)动态链接

文档评论(0)

白领文档(原创) + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档