版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第13章章 动态链接库动态链接库2本章主要内容 n动态连接库的概念及其组成n动态连接库的创建n动态连接库的使用3概论概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库静态链接库动态链接库”的时代。静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件
2、。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。4对动态链接库,我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C+还是Delphi。5(2)动态链接库随处可见我们在Windows目录下的system32文件夹中会看到kernel32.dll、user3
3、2.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作 6(3)VC动态链接库的分类Visual C+支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWi
4、nApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 713.1 动态链接库的基本概念动态链接库的基本概念nWindows 使用DLL实现程序模块共享。n其特点是:动态链接的;公用的;自动卸载。nDLL由全局数据、可导出函数、类和资源组成。主要任务:为使用它的各应用程序提供可调用的导出函数8根据编写规范,Windows必须查找并执行DLL里的DllMain函数作为加载DLL的依据,它使得DLL得以保留在内存里。这个函数并不属于导出函数,而是DLL的内部函数。这意味着不能直接在应用工程中引用DllMain函数,DllMain是自
5、动被调用的。9n动态链接库的入口函数动态链接库的入口函数BOOL APIENTRY DllMain( HANDLE hModule, /指向Dll本身的句柄 DWORD ul_reason_for_call, /Dll被调用的原因 LPVOID lpReserved )/系统所保留的参数/可以在这里编写DLL的初始化代码 return TRUE;13.1动态链接库的基本概念动态链接库的基本概念10 DllMain函数在DLL被加载和卸载时被调用,在单个线程启动和终止时,DLLMain函数也被调用,ul_reason_for_call指明了被调用的原因。原因共有4种,即PROCESS_ATTAC
6、H、PROCESS_DETACH、THREAD_ATTACH和THREAD_DETACH,以switch语句列出。 11BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)switch (ul_reason_for_call)case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:return TRUE; 12n导出函数和内部函数导出函数和内部函数uD
7、LL中定义的供外部应用程序调用的函数,叫做导出函数(export function);u只 为 在 D L L 内 部 调 用 的 函 数 叫 做 内 部 函 数(internal function);u导出函数在客户端叫做导入函数。13.1动态链接库的基本概念动态链接库的基本概念1313.2动态链接库的创建动态链接库的创建n 设计DLL的主要工作是编写库中的函数,方法与编写一般函数的方法基本相同。但要对库中的函数进行必要的声明,说明哪些函数是可以导出的,哪些不可以.n 声明DLL导出函数有两种方法: 在.def文件中声明; 使用关键字_declspec(dllexport)来声明。14n使用
8、使用def文件声明导出函数文件声明导出函数def文件又叫做模块定义文件,是用于描述DLL属性的文本文件。def文件一般包括以下模块定义语句:LIBRARY语句,指出DLL的名字。EXPORTS语句,列出库中导出函数的名称及导出函数的序号(可选)。DISCRIPTION语句,描述DLL的用途等说明。13.2动态链接库的创建动态链接库的创建15例如 ; DLL名字为SampleLIBRARY Sample; 函数ShowMe为导出函数EXPORTS ShowMe ;def文件结束13.2动态链接库的创建动态链接库的创建16u在创建DLL时,编译链接器先使用def文件创建两个文件:一个导出文件(.E
9、XP)和一个导入库文件(.LIB),然后使用导出文件再创建DLL文件。u导入库文件中存放了外部应用程序可导入的DLL导出函数名称的列表,函数的代码则存放在DLL文件中。u外部应用程序使用的文件是导入库文件和DLL文件。13.2动态链接库的创建动态链接库的创建17例13-1n创建一个Dll,在应用程序中调用它提供的ShowHello函数时,将弹出一个消息框,该消息框的信息为”Hello, World!”1)使用MFC AppWizard创建一个空的Win32Dynamic-Link Library工程,工程名为MFCexp13_1dll.2)在工程中新建一个文本文件,名为MFCexp13_1dl
10、l.def,输入以下代码:18;DLL的名称LIBRARY MFCexp13_1dll; 声明ShowHello为导出函数EXPORTS ShowHello;def文件结束19新建一个源文件MFCexp13_1dll.cpp,并在文件中添加如下代码:#include BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) return TRUE;int ShowHello(void)/需要导出的函数MessageBox(NULL,Hello World!,MB_YESNO);ret
11、urn TRUE;20n使用关键字使用关键字_declspec(dllexport)声明导出函数声明导出函数例 如 , 声 明 函 数 S h o w M s g 为 导 出 函 数 。_declspec(dllexport) int ShowMsg(int s);/导出C格式的函数(用C+编写的DLL函数)extern“C” _declspec(dllexport) int ShowMsg(int s);13.2动态链接库的创建动态链接库的创建21例13-2 重写13-1,用_declspec(dllexport)来声明导出函数2213.2动态链接库的创建动态链接库的创建n用MFC编写DLL
12、在VC+中还可以使用MFC来编写DLL。MFC支持两种形式的DLL:常规型DLL和扩展型DLL。nMFC常规型常规型DLLu常规型DLL可用于MFC应用程序和非MFC应用程序。用MFC AppWizard创建MFC DLL框架时,在New对话框中的Projects选项卡中选择MFC AppWizard(dll)选项,在出现的对话框中选择创建常规型DLL即可。uMFC把DLL的入口函数DLLMain封装在CWinApp中。u导出项目要使用关键字_declspec(dllexport)来说明。23例13-3n创建一个常规型DLL,它可以提供一个导出函数ShowMsg,当应用程序调用它时,将会显示一
13、个消息框,该消息框上显示字符串”MFC”241.创建一个常规DLL,在头文件中添加如下代码:_declspec(dllexport)int ShowMsg();2.在源文件中添加如下代码:_declspec(dllexport) int ShowMsg(void)char*msg=MFC;:MessageBox(NULL,msg,MB_OK);return 1;253.修改.def文件; MFCexp13_3dll.def : Declares the module parameters for the DLL.LIBRARY MFCexp13_3dllDESCRIPTION MFCexp13
14、_3dll Windows Dynamic Link LibraryEXPORTS ; Explicit exports can go hereShowMsg2613.2动态链接库的创建动态链接库的创建nMFC扩展型扩展型DLLu扩展型DLL可以导出MFC的继承类。u在 扩 展 型 D L L 中 , 在 类 的 名 称 前 面 加 宏AFX_EXT_CLASS,就可以把一个MFC继承类声明为导出类。例如:calss AFX_EXT_CLASS CMyDllClass:public CObject;27n注意:一个扩展DLL只能与MFC采用动态联编方式链接并且只能被MFC应用程序使用.n例13
15、-4创建一个MFC扩展DLL,它可以输出一个自定义的对话框.28n应用程序使用DLL的导出函数有两种方式:隐式链接;显式链接。n隐式链接方式需要使用DLL的应用程序把该DLL的导入文件加到应用程序的项目中。应用程序运行时,Windows会根据导入文件提供的信息加载DLL,应用程序通过函数名实现对DLL函数的动态链接。由于在程序中没有出现加载DLL的代码,所以把这种链接方式叫做隐式链接。13.3动态链接库的使用动态链接库的使用29nWindows搜索DLL的顺序为:1)包含应用程序EXE文件的目录2)进程的当前工作目录3)Windows系统目录4)Windows目录5)列在Path环境变量中的一
16、系列目录3013.3动态链接库的使用动态链接库的使用n显式链接方式在应用程序中使用Windows API函数直接完成DLL加载及函数调用,称为DLL的显式链接方式。具体步骤如下:获得DLL库获得DLL 函数释放DLL库31n1)获得DLL库通过调用Win32的LoadLibrary函数,并以要使用的DLL文件所在的路径为参数,可以取得DLL.HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);函数返回值为DLL库的句柄.32n获得DLL 函数获得DLL的句柄后,调用GetProcAddress来获得该DLL中与导入函数相匹配的导出函数.FARPROC Ge
17、tProcAddress(HMODULE hModule,LPCSTR lpProcName);返回值为DLL导出函数的地址.33n释放DLL库使用完DLL后,必须用FreeLibrary函数释放动态连接库.BOOL FreeLibrary(HMODULE hLibModule /DLL句柄);34n例13-5 创建一个应用程序,在该程序采用显式链接方式调用例13-3的DLL导出函数ShowMsg时,该导出函数可以显示一个对话框.35例如:typedef void (TESTDLL)();HINSTANCE hDllInst;/获得DLL库hDllInst=:LoadLibrary (”test.dll);if(hDllInst=NULL)AfxMessageBox(Fail);/获得DLL函数TESTDLL* lpproc;13.3动态链接库的使用动态链接库的使用36lpproc=(TESTDLL*)GetProcAdd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届阿里地区日土县三年级数学第二学期期中质量跟踪监视试题含答案解析
- 2026届阳江市阳春市数学四下期中监测模拟试题含解析
- 2026年河南省长葛市高三数学下册期末考试模拟试卷【各地真题】附答案
- 2026年湖南省沅江市高三数学下册期末考试模拟试卷及完整答案【名校卷】
- 2026年江西省高安市高三数学下册期末考试模拟检测卷附答案(典型题)
- 2026年河南省登封市高三数学下册期末考试模拟测试卷及完整答案(名师系列)
- 2026年湖南省冷水江市高三数学下册期末考试模拟测试卷及参考答案【能力提升】
- 2026年吉林省双辽市高三数学下册期末考试模拟检测卷(典型题)附答案
- 2026年重要设备采购与合同签署预备函8篇范文
- 医药研发工程师临床试验方案执行评估绩效考核表
- 中国人工智能学会中国人工智能系列白皮书-具身智能2026版
- 2026年广电网络公司考试试题及答案
- 2026年河南省机关事业单位工勤技能岗位等级考试(护理员·高级技师/一级)(综合评审技能)历年参考题
- L25J101-2建筑工程做法(下册)
- 2026广东省选调生招录1715人参考考试试题及答案解析
- 行政接待标准操作流程手册
- 普通动物学题库-普通动物学习题及答案
- 设备运输方案及保证措施
- 村医肺结核培训课件
- 脑膜瘤护理常规讲解
- 精致工艺PQ介绍
评论
0/150
提交评论