版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Fundamentals of Computers暨南大学珠海学院Windows编程制作:刘晓翔2022-2-10第九讲 动态链接库Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-102内容安排内容安排动态链接库动态链接库n Win32 DLL 的创建的创建n 显式加载方式加载显式加载方式加载DLLn DllMain函数函数n 动态链接库概述动态链接库概述n MFC DLLn 隐式链接方式加载隐式链接方式加载DLLFundamentals of Computers制作:刘晓翔JINAN Univers
2、ity暨南大学珠海学院Windows编程2022-2-103动态链接库概述动态链接库概述n动态链接库动态链接库不能直接运行,不能接收消息不能直接运行,不能接收消息。它们是一些独立的文。它们是一些独立的文件,其中包含能被可执行程序或其它件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函调用来完成某项工作的函数。数。只有在其它模块调用动态链接库中的函数时,它才发挥作用只有在其它模块调用动态链接库中的函数时,它才发挥作用。n 微软任何一个版本的微软任何一个版本的Windows操作系统,操作系统,动态链接库动态链接库(DLL)都)都是其是其核心核心和和基础基础。n Windows API中的
3、所有函数都包含在中的所有函数都包含在DLL中。其中有中。其中有3个最重要的个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个,它包含用于画图和显示文本的各个函数。函数。Dll 概述概述Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2
4、022-2-104动态链接库概述动态链接库概述静态库(静态库(LIB)和动态库()和动态库(DLL)n 静态库:静态库:函数和数据被编译进一个二进制文件(通常扩展函数和数据被编译进一个二进制文件(通常扩展名为名为.LIB)。在使用静态库的情况下,在编译链接可执行文)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中件时,链接器从库中复制复制这些函数和数据,并把它们和应用这些函数和数据,并把它们和应用程序的其它模块组合起来创建最终的可执行文件(程序的其它模块组合起来创建最终的可执行文件(.EXE文文件)。件)。n 在使用在使用动态库动态库的时候,往往提供两个文件:的时候,往往提供两个文
5、件:一个引入库一个引入库和和一个一个DLL。引入库引入库包含被包含被DLL导出的导出的函数和变量的符号名函数和变量的符号名,DLL包含实际的函数和数据包含实际的函数和数据。在编译链接可执行文件时,只。在编译链接可执行文件时,只需要链接引入库,需要链接引入库,DLL中的函数代码和数据中的函数代码和数据并不复制并不复制到可执到可执行文件中,在运行的时候,再去加载行文件中,在运行的时候,再去加载DLL,访问,访问DLL中导出中导出的函数。的函数。Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-105动态链接
6、库概述动态链接库概述使用动态链接库的好处使用动态链接库的好处 增强程序的扩展性增强程序的扩展性 可以采用多种编程语言来写可以采用多种编程语言来写 提供二次开发的平台提供二次开发的平台 简化项目管理简化项目管理 节省磁盘空间和内存节省磁盘空间和内存 有助于资源共享有助于资源共享Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-106内容安排内容安排n Win32 DLL 的创建的创建n 显式加载方式加载显式加载方式加载DLLn DllMain函数函数n 动态链接库概述动态链接库概述n MFC DLLn 隐
7、式链接方式加载隐式链接方式加载DLL动态链接库动态链接库Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-107Win32 DLL 的创建的创建创建创建Dll文件文件 新建一个新建一个 Win32 Dynamic-Link Library 工程,在工程,在AppWizard的第一步选择的第一步选择“An empty Dll project”,创建一个空,创建一个空的动态链接库工程。添加一个的动态链接库工程。添加一个C+源文件:源文件:Dll.cpp,在其中写,在其中写入如下代码:入如下代码:int ad
8、d(int a, int b)return a + b;int subtract(int a, int b)return a - b;Build后,在后,在Debug目录下会产生一个目录下会产生一个Dll1.dll文件。文件。Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-108Win32 DLL 的创建的创建导出导出DLL中的函数中的函数 注意注意:应用程序如果想要访问:应用程序如果想要访问 DLL中的函数,那么该函数中的函数,那么该函数必须是已经必须是已经被导出被导出的函数。的函数。 为了让为了让
9、DLL 导出函数,需要在每一个将要被导出的导出函数,需要在每一个将要被导出的函数前函数前添加标识符:添加标识符:_declspec (dllexport)。_declspec (dllexport) int add(int a, int b)return a + b;_declspec (dllexport) int subtract(int a, int b)return a - b;Build后,在后,在Debug目录下会产生一个动态库目录下会产生一个动态库Dll1.dll文件和一个文件和一个引入库文件引入库文件Dll1.lib。Fundamentals of Computers制作:刘晓
10、翔JINAN University暨南大学珠海学院Windows编程2022-2-109Win32 DLL 的创建的创建导出导出DLL中的类中的类 在动态链接库中,除了函数能被导出,在动态链接库中,除了函数能被导出,C+类同样也类同样也能够被导出。能够被导出。 为了让为了让DLL导出类,在导出类,在DLL中定义类时,需要在中定义类时,需要在class关键字和类名之间关键字和类名之间加入标识符:加入标识符:_declspec (dllexport)。 注意:注意:在访问导出类的函数时,仍受限于函数自身的在访问导出类的函数时,仍受限于函数自身的访问权限。也就是说,如果该类的某个函数访问权限不是访问
11、权限。也就是说,如果该类的某个函数访问权限不是Pubilc,那么外部程序仍无法访问这个函数。,那么外部程序仍无法访问这个函数。 另外,在实现动态链接库时,可以不导出整个类,而另外,在实现动态链接库时,可以不导出整个类,而只导出该类中的某些成员函数。具体做法是将标识符添加只导出该类中的某些成员函数。具体做法是将标识符添加到成员函数前。到成员函数前。Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1010内容安排内容安排n Win32 Dll 的创建的创建n 显式加载方式加载显式加载方式加载DLLn Dl
12、lMain函数函数n 动态链接库概述动态链接库概述n MFC DLLn 隐式链接方式加载隐式链接方式加载DLL动态链接库动态链接库Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1011隐式链接方式加载隐式链接方式加载DLLDLL测试程序测试程序 新建一个基于对话框的新建一个基于对话框的MFC应用程序,在主对话框资源应用程序,在主对话框资源上放置两个按钮上放置两个按钮“Add”和和“Subtract”,编写如下响应函数:,编写如下响应函数:void CDllTestDlg:OnAdd() CStrin
13、g str;str.Format(7 + 5 = %d, add(7,5);MessageBox(str);void CDllTestDlg:OnSubtract() CString str;str.Format(7 - 5 = %d, subtract(7,5);MessageBox(str);Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1012隐式链接方式加载隐式链接方式加载DLLextern int add(int a,int b);extern int subtract(int a,int
14、 b);void CDllTestDlg:OnAdd() CString str;str.Format(7 + 5 = %d, add(7,5);MessageBox(str);void CDllTestDlg:OnSubtract() CString str;str.Format(7 - 5 = %d, subtract(7,5);MessageBox(str);利用利用 extern 声明外部函数声明外部函数 以上程序编译提示两个错误:不认识函数以上程序编译提示两个错误:不认识函数add与与subtract。因此,需对这两个函数做一个声明。因此,需对这两个函数做一个声明。 extern 关
15、键字表明函关键字表明函数是在外部定义的数是在外部定义的Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1013隐式链接方式加载隐式链接方式加载DLL 以上程序能够成功通过编译,但在程序链接时会以上程序能够成功通过编译,但在程序链接时会产生三个错误,因为此时链接器不知道这两个函数是产生三个错误,因为此时链接器不知道这两个函数是在哪个地方实现的。在哪个地方实现的。 为了解决这个问题,就需要利用动态链接库的为了解决这个问题,就需要利用动态链接库的引引入库文件入库文件。引入库文件并没有包含实际的代码,它是。引
16、入库文件并没有包含实际的代码,它是用来为链接程序提供必要的信息,以便在可执行文件用来为链接程序提供必要的信息,以便在可执行文件中建立动态链接时需要用到的重定位表。中建立动态链接时需要用到的重定位表。使用引入库文件使用引入库文件Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1014隐式链接方式加载隐式链接方式加载DLL加入引入库的两种方法加入引入库的两种方法加载之前先把加载之前先把dll1.lib复制到复制到dlltest工程目录中:工程目录中:方法一:方法一: 选择选择“projectSetting
17、s”命令,选择命令,选择link选项卡,选项卡,在在“Object/library modules”选项编辑框中输入:选项编辑框中输入:dll1.lib方法二:方法二: 通过通过“add files to project”直接将直接将dll1.lib加加入到工程中。入到工程中。Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1015隐式链接方式加载隐式链接方式加载DLL 除了使用除了使用 extern 关键字表明函数是外部定义的之关键字表明函数是外部定义的之外,还可以使用标识符:外,还可以使用标识符:
18、_declspec (dllimport)来表明来表明函数是从动态链接库中引入的。函数是从动态链接库中引入的。 与使用与使用 extern 相比,使用相比,使用_declspec (dllimport) 将将告诉编译器该函数是来源于动态链接库,从而编译器告诉编译器该函数是来源于动态链接库,从而编译器可以生成运行效率更高的代码可以生成运行效率更高的代码。利用利用_declspec (dllimport) 声明外部函数声明外部函数_declspec (dllimport) int add(int a,int b);_declspec (dllimport) subtract(int a,int b
19、);Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1016隐式链接方式加载隐式链接方式加载DLL 为查看一个可执行模块依赖的动态链接库,为查看一个可执行模块依赖的动态链接库, Visual Studio提供了一个图形化工具提供了一个图形化工具Depends来实现。位于:来实现。位于:“Microsoft Visual Studio 6.0Microsoft Visual Studio 6.0 Tools”菜单中。菜单中。Depends工具工具 在在Depends窗口中,左上方的窗格中显示了应用程序窗
20、口中,左上方的窗格中显示了应用程序需要访问的需要访问的DLL文件名称;当选中其中的一个文件名称;当选中其中的一个DLL时,时,右上方的窗格列出了该右上方的窗格列出了该DLL中被可执行程序调用的函数;中被可执行程序调用的函数;右下方的窗格列出了右下方的窗格列出了DLL所导出的函数。所导出的函数。Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1017内容安排内容安排n Win32 DLL 的创建的创建n 显式加载方式加载显式加载方式加载DLLn DllMain函数函数n 动态链接库概述动态链接库概述n
21、MFC DLLn 隐式链接方式加载隐式链接方式加载DLL动态链接库动态链接库Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1018显式加载方式加载显式加载方式加载DLLLoadLibrary函数函数HMODULE LoadLibrary( LPCTSTR lpFileName); 该函数的作用是将指定的可执行模块映射到调用进该函数的作用是将指定的可执行模块映射到调用进程的地址空间。程的地址空间。LoadLibrary不仅能够加载不仅能够加载DLL,还可,还可以加载可执行模块(以加载可执行模块(*.e
22、xe),当加载可执行模块时,),当加载可执行模块时,主要是为了访问该模块内的资源,例如对话框资源、主要是为了访问该模块内的资源,例如对话框资源、图标或位图资源。图标或位图资源。 当获取到动态链接库模块的句柄后,接下来需要获当获取到动态链接库模块的句柄后,接下来需要获取该动态链接库中导出函数的地址。取该动态链接库中导出函数的地址。Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1019显式加载方式加载显式加载方式加载DLLGetProcAddress函数函数FARPROC GetProcAddress(
23、 HMOUDLE hModule, LPCSTR lpProcName); 该函数的作用是用来获取该函数的作用是用来获取DLL导出函数的地址。导出函数的地址。 hModule:指定:指定DLL模块的句柄,即模块的句柄,即LoadLibrary函数函数的返回值。的返回值。 LpProcName:字符指针,指定:字符指针,指定DLL导出函数的名字或导出函数的名字或函数的序号。函数的序号。Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1020显式加载方式加载显式加载方式加载DLL显示加载显示加载DLL实例
24、实例void CDllTestDlg:OnAdd() HMODULE hModule;hModule = LoadLibrary(Dll1.dll);typedef int (*FUNC) (int a, int b); /定义函数指针类型定义函数指针类型FUNC add = (FUNC)GetProcAddress(hModule, add);if (!add)MessageBox(获取函数地址失败获取函数地址失败!);return;CString str;str.Format(7 + 5 = %d, add(7,5);MessageBox(str);Fundamentals of Comp
25、uters制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1021显式加载方式加载显式加载方式加载DLL名字改编问题名字改编问题 上述程序运行会谈处消息框上述程序运行会谈处消息框“获取函数地址失败!获取函数地址失败!”,原因如下:原因如下: C+编译器在生成编译器在生成DLL时,会对导出的函数进行时,会对导出的函数进行名字改名字改编编,并且不同的编译器使用的改编规则不一样,因此改编,并且不同的编译器使用的改编规则不一样,因此改编后的名字不一样的。后的名字不一样的。 因此,因此,GetProcAddress的第二个参数需要写改编后的函的第二个参数需要写
26、改编后的函数名。数名。 (改编后的函数名字可通过(改编后的函数名字可通过Depends工具查到)工具查到)FUNC add = (FUNC)GetProcAddress(hModule, ?addYAHHHZ);Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1022显式加载方式加载显式加载方式加载DLL名字改编问题(续)名字改编问题(续) 如果希望动态链接库在编译时,导出函数的名称不要发如果希望动态链接库在编译时,导出函数的名称不要发生改变,在定义导出函数时,需要加上限定符:生改变,在定义导出函数时
27、,需要加上限定符:extern Cextern C _declspec (dllexport) int add(int a, int b)return a + b;extern C _declspec (dllexport) int subtract(int a, int b)return a - b; extern “C”可以解决可以解决C+对对C语言之间的函数名改编问题,但这语言之间的函数名改编问题,但这种方法有一个缺陷,就是不能用于导出一个类的成员函数,种方法有一个缺陷,就是不能用于导出一个类的成员函数,只能只能用于导出全局函数这种情况用于导出全局函数这种情况。Fundamentals of Computers制作:刘晓翔JINAN University暨南大学珠海学院Windows编程2022-2-1023内容安排内容安排n Win32 Dll 的创建的创建n 显式加载方式加载显式加载方式加载Dlln DllMain函数函数n 动态链接库概述动态链接库概述n MFC Dlln 隐式链接方式加载隐式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年油罐项目环保设施运行监测与数据分析合同范本3篇
- 2025年度出租车行业新能源车辆推广应用合同3篇
- 2024年版技术服务合同:云计算平台建设与维护
- 2024年食品工业原料采购协议示例版
- 2025年度冲击钻施工材料采购与供应链管理合同3篇
- 2025年度智能家居安全系统承包套房装修合同3篇
- 2025年度新型环保项目贷款合同范本3篇
- 2024限定版汽车销售协议范本一
- 2024年茶叶种植与加工项目合作协议版
- 2024年项目实施委托协议版B版
- 外科手术抗凝药物停用指南
- 健康管理师培训课
- 农作物植保员培训课件
- 2024韩束品牌拆解-蝉妈妈
- 建筑企业合同管理培训课件
- 化工有限公司3万吨水合肼及配套项目环评可研资料环境影响
- 非急救转运公司计划书
- 2023年中国软件行业基准数据SSM-BK-202310
- 天津市部分区2023-2024学年高一上学期期末练习生物试题【含答案解析】
- 稀土铝合金电缆项目招商引资方案
- 人教版六年级数学下册全册分层作业设计含答案
评论
0/150
提交评论