第九讲动态链接库.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

FundamentalsofComputers暨南大学珠海学院《Windows编程》制作:刘晓翔2019/12/19第九讲动态链接库FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/192内容安排动态链接库Win32DLL的创建显式加载方式加载DLLDllMain函数动态链接库概述MFCDLL隐式链接方式加载DLLFundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/193动态链接库概述动态链接库不能直接运行,不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。微软任何一个版本的Windows操作系统,动态链接库(DLL)都是其核心和基础。WindowsAPI中的所有函数都包含在DLL中。其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个函数。Dll概述FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/194动态链接库概述静态库(LIB)和动态库(DLL)静态库:函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据,并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件)。在使用动态库的时候,往往提供两个文件:一个引入库和一个DLL。引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/195动态链接库概述使用动态链接库的好处增强程序的扩展性可以采用多种编程语言来写提供二次开发的平台简化项目管理节省磁盘空间和内存有助于资源共享FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/196内容安排Win32DLL的创建显式加载方式加载DLLDllMain函数动态链接库概述MFCDLL隐式链接方式加载DLL动态链接库FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/197Win32DLL的创建创建Dll文件新建一个Win32Dynamic-LinkLibrary工程,在AppWizard的第一步选择“AnemptyDllproject”,创建一个空的动态链接库工程。添加一个C++源文件:Dll.cpp,在其中写入如下代码:intadd(inta,intb){returna+b;}intsubtract(inta,intb){returna-b;}Build后,在Debug目录下会产生一个Dll1.dll文件。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/198Win32DLL的创建导出DLL中的函数注意:应用程序如果想要访问DLL中的函数,那么该函数必须是已经被导出的函数。为了让DLL导出函数,需要在每一个将要被导出的函数前添加标识符:_declspec(dllexport)。_declspec(dllexport)intadd(inta,intb){returna+b;}_declspec(dllexport)intsubtract(inta,intb){returna-b;}Build后,在Debug目录下会产生一个动态库Dll1.dll文件和一个引入库文件Dll1.lib。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/199Win32DLL的创建导出DLL中的类在动态链接库中,除了函数能被导出,C++类同样也能够被导出。为了让DLL导出类,在DLL中定义类时,需要在class关键字和类名之间加入标识符:_declspec(dllexport)。注意:在访问导出类的函数时,仍受限于函数自身的访问权限。也就是说,如果该类的某个函数访问权限不是Pubilc,那么外部程序仍无法访问这个函数。另外,在实现动态链接库时,可以不导出整个类,而只导出该类中的某些成员函数。具体做法是将标识符添加到成员函数前。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1910内容安排Win32Dll的创建显式加载方式加载DLLDllMain函数动态链接库概述MFCDLL隐式链接方式加载DLL动态链接库FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1911隐式链接方式加载DLLDLL测试程序新建一个基于对话框的MFC应用程序,在主对话框资源上放置两个按钮“Add”和“Subtract”,编写如下响应函数:voidCDllTestDlg::OnAdd(){CStringstr;str.Format(7+5=%d,add(7,5));MessageBox(str);}voidCDllTestDlg::OnSubtract(){CStringstr;str.Format(7-5=%d,subtract(7,5));MessageBox(str);}FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1912隐式链接方式加载DLLexternintadd(inta,intb);externintsubtract(inta,intb);voidCDllTestDlg::OnAdd(){CStringstr;str.Format(7+5=%d,add(7,5));MessageBox(str);}voidCDllTestDlg::OnSubtract(){CStringstr;str.Format(7-5=%d,subtract(7,5));MessageBox(str);}利用extern声明外部函数以上程序编译提示两个错误:不认识函数add与subtract。因此,需对这两个函数做一个声明。extern关键字表明函数是在外部定义的FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1913隐式链接方式加载DLL以上程序能够成功通过编译,但在程序链接时会产生三个错误,因为此时链接器不知道这两个函数是在哪个地方实现的。为了解决这个问题,就需要利用动态链接库的引入库文件。引入库文件并没有包含实际的代码,它是用来为链接程序提供必要的信息,以便在可执行文件中建立动态链接时需要用到的重定位表。使用引入库文件FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1914隐式链接方式加载DLL加入引入库的两种方法加载之前先把dll1.lib复制到dlltest工程目录中:方法一:选择“project\Settings”命令,选择link选项卡,在“Object/librarymodules”选项编辑框中输入:dll1.lib方法二:通过“addfilestoproject…”直接将dll1.lib加入到工程中。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1915隐式链接方式加载DLL除了使用extern关键字表明函数是外部定义的之外,还可以使用标识符:_declspec(dllimport)来表明函数是从动态链接库中引入的。与使用extern相比,使用_declspec(dllimport)将告诉编译器该函数是来源于动态链接库,从而编译器可以生成运行效率更高的代码。利用_declspec(dllimport)声明外部函数_declspec(dllimport)intadd(inta,intb);_declspec(dllimport)subtract(inta,intb);FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1916隐式链接方式加载DLL为查看一个可执行模块依赖的动态链接库,VisualStudio提供了一个图形化工具——Depends来实现。位于:“MicrosoftVisualStudio6.0\MicrosoftVisualStudio6.0Tools”菜单中。Depends工具在Depends窗口中,左上方的窗格中显示了应用程序需要访问的DLL文件名称;当选中其中的一个DLL时,右上方的窗格列出了该DLL中被可执行程序调用的函数;右下方的窗格列出了DLL所导出的函数。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1917内容安排Win32DLL的创建显式加载方式加载DLLDllMain函数动态链接库概述MFCDLL隐式链接方式加载DLL动态链接库FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1918显式加载方式加载DLLLoadLibrary函数HMODULELoadLibrary(LPCTSTRlpFileName);该函数的作用是将指定的可执行模块映射到调用进程的地址空间。LoadLibrary不仅能够加载DLL,还可以加载可执行模块(*.exe),当加载可执行模块时,主要是为了访问该模块内的资源,例如对话框资源、图标或位图资源。当获取到动态链接库模块的句柄后,接下来需要获取该动态链接库中导出函数的地址。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1919显式加载方式加载DLLGetProcAddress函数FARPROCGetProcAddress(HMOUDLEhModule,LPCSTRlpProcName);该函数的作用是用来获取DLL导出函数的地址。hModule:指定DLL模块的句柄,即LoadLibrary函数的返回值。LpProcName:字符指针,指定DLL导出函数的名字或函数的序号。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1920显式加载方式加载DLL显示加载DLL实例voidCDllTestDlg::OnAdd(){HMODULEhModule;hModule=LoadLibrary(Dll1.dll);typedefint(*

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功