欢迎来到天天文库
浏览记录
ID:50308626
大小:492.00 KB
页数:45页
时间:2020-03-07
《Windows系统编程 教学课件 作者 李晓黎第10章.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Windows系统编程实用教程授课教师:职务:第10章动态链接库编程课程描述在开发比较大的程序时,往往需要多个程序员协作完成。有人负责数据库操作,有人负责文件操作,有人负责业务逻辑设计,有人负责用户界面设计。但是他们不能在同一台计算机上使用同一个项目来进行编码,因为这样不但在实际上很难操作,而且会把代码搞得很乱。通常的做法是:负责底层功能设计的程序员使用动态链接库实现具体功能,负责用户界面设计的程序员在项目中引用动态链接库,并调用其中的具体功能,这样就把多个程序员的工作集成到一个项目中。这种方法不仅解决了多人合作开发的问题,而且是程序具有很好的模块化,便于定位和调试问题。本章知识点10.
2、1动态链接库的概念10.2开发动态链接库10.3加载和使用DLL10.1动态链接库的概念动态链接库(DLL,Dynamic-linklibrary)是微软实现的共享库概念,其文件扩展名通常为.dll,也可以是.ocx(包含Active控件的动态链接库)和.drv(系统驱动程序)。1.内存管理DLL文件中可以分段管理,每个段(section)都有自己的属性,比如可写或只读、可执行(代码段)或不可执行(数据段)等。DLL中的代码通常可以在引用DLL的进程中共享,也就是说,它们在物理内存中占有独立的空间,但不占用页文件的空间。如果物理内存中被DLL代码段占用的空间需要重新分配,则其中的内容会被
3、忽略,下次使用时再从DLL文件中重新加载。与代码段不同,DLL中得为数据段通常是私有的。使用DLL的每个进程都有自己的DLL数据复件。也可以把DLL的数据段配置成共享的,通过这种方式可以实现进程间的通信。但是,这也造成了一个安全漏洞。比如,一个进程可以破坏共享数据,从而导致其他使用共享数据的进程出现异常。因此,应尽量避免在DLL中使用共享数据。2.导入库导入库的扩展名是*.lib,它与DLL文件同时生成,它们的名字相同,只有扩展名不同。导入库中包含一个导入地址表(IAT,importaddresstable)。DLL中的每个函数都在导入地址表有一个记录。如果在项目中引用了DLL文件,则在
4、生成和链接可执行文件时,链接到动态链接库通常被处理为链接到导入库。这样,可执行文件就可以通过导入库中的导入地址表知道如何调用DLL中的函数。导入库就像一本书的目录和索引,而DLL则是书的正文。在生成可执行文件时,可执行文件中已经包含了导入库中的导入地址表。在运行时,还必须找到DLL文件。可执行文件会根据导入地址表在DLL文件中调用函数。3.符号解析和生成DLL中的每个导出函数都可以使用一个数字序号和一个可选的名字来标识。可以使用数字序号和名字从DLL中导入函数。序号代表DLL导出地址表中的函数地址指针的位置,通常用于只按序号导出内部函数的情形。而对大多数WindowsAPI函数而言,在不
5、同的Windows产品和版本中,只有名字被保留,而序号是变化的。因此使用序号导入DLL函数的方法兼容性并不好。使用序号导入DLL函数比使用名字导入DLL函数要稍微高效一点。DLL的导出表是按名字排序的,使用名字导入DLL函数要首先在导出表中找到名字的位置;而使用序号导入DLL函数则可以直接在导出表中定位函数的位置。也可以将可执行文件绑定到特定版本的DLL,这样就可以在编译时解析导入函数的地址了。这也称为绑定导入。此时,链接器保存绑定导入的DLL文件的时间戳和校验和(checksum)。运行时,Windows首先检查使用的库是否与绑定的库版本相同,如果相同,则省略处理导入的过程(因为在编译
6、时已经解析并记录导入函数的地址了);否则,Windows会按照正常的方式来处理导入。如果绑定DLL的可执行文件在与其编译环境相同的环境中运行,它就会运行得快一点。每个标准的Windows应用程序都绑定到一个版本的Windows的系统DLL。将应用程序的导入和其目标环境绑定的最佳时机实在安装应用程序的过程中。这样,除非升级操作系统,都会保持绑定库。10.2开发动态链接库10.2.1创建动态链接库项目10.2.2在DLL中添加导出函数10.2.3在DLL中添加导出类10.2.1创建动态链接库项目在VisualStudio2008中打开“新建项目”对话框,在“项目类型”列表中,选择“Visua
7、lC++”/“Win32”,然后在右侧的模板列表中选中“Win32项目”,如图10.1所示。在“名称”文本框中输入mylib,然后单击“确定”按钮,打开如图10.2所示的向导对话框。Win32应用程序向导单击“下一步”按钮,打开“应用程序配置”对话框,在“应用程序”列表中选择“DLL”如图10.3所示。“应用程序配置”对话框DllMain()是DLL的入口函数#include"stdafx.h"BOOLAPIENTRYDllMain
此文档下载收益归作者所有