VC++环境下的动态链接库的开发与应用.doc
《VC++环境下的动态链接库的开发与应用.doc》由会员分享,可在线阅读,更多相关《VC++环境下的动态链接库的开发与应用.doc(34页珍藏版)》请在三一办公上搜索。
1、目录目录1中文摘要2Abstract2一、概论31.1. 研究背景31.2. 动态链接库的定义31.3. 动态链接库与静态链接库41.3.1. 静态链接库41.3.2. 动态链接库与静态链接库的区别41.4. 动态链接库的优点41.5. 在以下这些情况下,必须使用动态链接库:51.6. Visual C+支持的动态链接库的类型5二、非MFC动态链接库62.1. Non-MFC DLL动态链接库的创建62.1.1. 创建一个Non-MFC Dll工程“MyDll”62.1.2. 代码分析82.2. 声明导出函数92.3. DLL的调用方式102.4. DllMain函数11三、MFC规则动态链接
2、库的创建133.1. 概述133.2. MFC规则DLL分为两类:133.3. MFC规则DLL的创建143.4. MFC规则DLL的调用183.5. 隐式调用22四、MFC扩展动态链接库的创建24 4.1. 概述24 4.3. MFC扩展DLL的加载30五、动态链接库的典型应用315.4. DLL木马36六、参考文献37七、致谢38中文摘要 动态链接库英文为Dynamic Link Library,英文缩写为DLL,是程序运行时由该程序动态链接调用的函数库,是一些函数、数据和类集合成的可执行模块,程序员可以将动态链接库动态地集成到自己的程序中以使用库中的函数、数据和类。开发和应用动态链接库,
3、有助于数据和资源的共享,简化了软件项目的管理。本文主要介绍动态链接库创建、调用方法,及其典型应用。关键词:动态链接库(DLL),非MFC DLL,MFC规则DLL,MFC扩展DLLAbstractDynamic Link Library (DLL) encapsulates the shared resource and codeIn exploring the application based on Windows,the use of DLL technology can greatly save the memoryUsing DLL developing project can si
4、mplify the project management and speed up the explorationThis paper,introducing the implicit and explicit linking of DLL with instances,provides technical support to technicians in exploring and using DLL Key words:Dynamic Link Library (DLL) , Non-MFC DLL ,MFC Regular DLL , MFC Extension DLL一、概论1.1
5、. 研究背景自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着,例如显示的字体和图标存储在GDI DLL中、显示Windows桌面和处理用户的输入所需要的代码被存储在一个User DLL中、Windows编程所需要的大量的API函数也被包含在Kernel DLL中。在Windows操作系统中使用DLL有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个DLL文件,真正实现了资源共享,大大缩小了应用程序的执行代
6、码,更加有效的利用了内存;使用DLL的另一个优点是DLL文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修改相应的DLL文件就可以了,而且,当DLL中的函数改变后,只要不是参数的改变,程序代码并不需要重新编译。这在编程时十分有用,大大提高了软件开发和维护的效率。既然DLL那么重要,所以搞清楚什么是DLL、如何在Windows操作系统中开发使用DLL是程序开发人员不得不解决的一个问题。本文针对这些问题,通过一个简单的例子,全面地解析了在Visual C+编译环境下编程实现DLL的过程。1.2. 动态链接库的定义动态链接库英文为Dynamic Link Libra
7、ry,英文缩写为DLL,是程序运行时由该程序动态链接调用的函数库,是一些函数、数据和类集合成的可执行模块,程序员可以将动态链接库动态地集成到自己的程序中以使用库中的函数、数据和类。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。多个应用程序可同时访问内存中单个DLL 副本的内容。1.3. 动态链接库与静态链接库1.3.1. 静态链接库静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去。静态链接库不同于动态链接库(*.dll),在静态库情况下
8、,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C+的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为静态链接,此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。用户在交付最终静态链接库时,只需要提供.lib文件和相应的头文件,不需要再提供库的源代码。在需要使用静态库的工程中,包含相应的头文件,并把.lib文件加入工程中就可以了。1.3.2. 动态链接库与静态链接库的区别动态链接发生在程序运行时,动态链接的函数代码不出现在程序的EXE文件中,它仅仅包含了
9、应用程序运行过程中所调用的DLL函数的一些最基本信息(例如DLL文件位置、函数名等);而静态链接发生在编译时,静态链接的函数代码实际被插入到程序的EXE文件中。1.4. 动态链接库的优点动态链接库随处可见,无论大型系统还是小规模软件,都应用了动态链接库,有效地实现了资源共享。在软件开发中,应用动态链接库具有以下优点:(1)扩展了应用程序的特性;(2)可以用许多种编程语言来编写; (3)简化了软件项目的管理; (4)有助于节省内存; (5)有助于资源共享; (6)有助于应用程序的本地化;(7)有助于解决平台差异。1.5. 在以下这些情况下,必须使用动态链接库:(1)多个应用程序共享代码和数据(2
10、)在各子程序过滤系统消息时必须使用动态链接库(3)设备驱动程序必须是动态链接库(4)在对话框编辑器中使用自己定义的控件,也必须使用动态链接库(5)为了实现应用程序的国际化,往往需要使用动态链接库1.6. Visual C+支持的动态链接库的类型Visual C+支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。(1) 非MFC动态库指不使用MFC类库创建的DLL。Win32 DLL中的导出函数通常使用标准的C接口,这些函数可以被MFC或非MFC应用程序调用。(2) MF
11、C规则DLL MFC规则DLL可以使用MFC来创建,可以导出C风格的函数,但不能导出C+类、成员函数或重载函数。它们可以被MFC或非MFC应用程序调用。但这种类型的DLL不能向应用程序传递MFC对象指针,必须使用MFC扩展DLL。MFC常规DLL按照与MFC的链接方式又分动态链接和静态链接两种。(3) MFC扩展DLL表面上更像应用程序而不像一组函数的集合,因为它可以创建MFC派生类。只能以动态方式与MFC链接,而且只能是使用MFC的动态链接版本的应用程序才可以使用这种DLL。在MFC扩展DLL中,可以由现有的MFC类导出自己的类,然后给应用程序一个扩展的MFC版本。支持C+接口,也就是说,该
12、DLL可以导出整个类,客户可以构造这些类的对象或从这些类进行派生。还可以用于在应用程序和DLL之间传递MFC导出对象。对象的成员函数位于创建对象的模块中,应用程序和它加载的扩展DLL之间可以自如地传递MFC或MFC导出对象的指针。 接下来,我们一起来具体讨论一下以上三种动态链接库的创建方法与调用方法。二、非MFC动态链接库2.1. Non-MFC DLL动态链接库的创建在Visual C+6.0开发环境下,打开File/New/Project选项,可以选择Win32 Dynamic-Link Library或MFC AppWizarddll 来以不同的方式来创建Non-MFC Dll、Regu
13、lar Dll、Extension Dll等不同种类的动态链接库。下面演示以Win32 Dynamic-Link Library方式创建一个简单Non-MFC Dll工程“MyDll”。2.1.1. 创建一个Non-MFC Dll工程“MyDll”(1) 在Visual C+6.0开发环境下,打开File/New/Project选项,选择Win32 Dynamic-Link Library创建一个简单DLL工程,并命名为“MyDll”。图2-1-1 创建Non-MFC Dll工程“MyDll”(2) 在建立的工程中添加lib.h及lib.cpp文件,源代码如下:/* 文件名:lib.h*/#i
14、fndef LIB_H#define LIB_Hextern C int _declspec(dllexport)multi(int x,int y);#endif/* 文件名:lib.cpp*/#include lib.hint multi(int x,int y) return x*y;显然,以上建立的是一个返回两个数的乘积的动态链接库。(3)建立一个与MyDll工程处于同一工作区的应用工程DllCall。图2-1-2 创建应用工程“DllCall”在工程“DllCall”创建源代码文件“DllCall.cpp”,它调用DLL中的函数multi,其源代码如下:#include #inclu
15、de typedef int(*lpmultiFunc)(int,int); /宏定义函数指针类型int main() HINSTANCE hDll; /DLL句柄lpmultiFunc multiFunc; /函数指针hDll = LoadLibrary(.DebugMyDll.dll);if (hDll != NULL) multiFunc = (lpmultiFunc)GetProcAddress(hDll, multi);if (multiFunc != NULL) int result = multiFunc(3,5); /计算3与5的乘积 printf(%dn,result);Fr
16、eeLibrary(hDll);return 0;(4) 编译,运行结果如下:图2-1-3 运行结果 如上图所示,成功返回3*5的结果,表明此NON-MFC DLL创建成功。2.1.2. 代码分析分析上述代码,Mydll工程中的lib.h对函数multi的声明前面添加了_declspec(dllexport)语句。这个语句的含义是声明函数multi为DLL的导出函数。DLL内的函数分为两种:(1) DLL导出函数,可供应用程序调用;(2) DLL内部函数,只能在DLL程序使用,应用程序无法调用它们。现在分析应用工程dllCall 对 DLL 的调用是如何实现的:首先,语句typedef int
17、 ( * lpmultiFun)(int,int)定义了一个与multi函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpmultiFunc的实例multiFunc;其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数multi的地址并赋给了multiFunc。经由函数指针multiFunc进行了对DLL中add函数的调用; 最后,应用工程
18、使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。从而完成了对dll的调用。通过以上例子分析可得出以下结论:(1)DLL中需以某种特定的方式声明导出函数(或变量、类);(2)应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。2.2. 声明导出函数DLL中导出函数的声明有两种方式:一是像上述例子一样,在定义函数时使用导出关键字_declspec(dllexport);另外一种方法是在创建DLL文件时使用模块定义文件.def。如以下例子:下面的代码演示了怎样在 .def 文件中将函数multi声明为DLL导出函数(需在MyDll
19、工程中添加lib.def文件):LIBRARY MydllEXPORTSmulti 1def文件的规则为:(1)LIBRARY语句说明.def文件相应的DLL;(2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);(3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。由此可以看出,例子中lib.def文件的含义为生成名为“MyDll”的动态链接库,导出其中的multi函数,并指定multi函数的序号为1。2.3. DLL的调用方式DLL有两种调用方式:(
20、1) 动态调用在上述的例子中我们看到了由“LoadLibrary-GetProcAddress-FreeLibrary”系统Api提供的三位一体“DLL加载-DLL函数地址获取-DLL释放”方式,这种调用方式称为DLL的动态调用。 动态调用方式的特点是完全由编程者用 API 函数加载和卸载 DLL,程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。(2) 静态调用静态调用方式的特点是由编译系统完成对DLL的加载和应用程序结束时 DLL 的卸载。当调用某DLL的应用程序结束时,若系统中还有其它程序使用该 DLL,则Windows对DLL的应用记录减1,直到
21、所有使用该DLL的程序都结束时才释放它。静态调用方式简单实用,但不如动态调用方式灵活。如以下例子所示:将编译MyDll工程所生成的.lib和.dll文件拷入dllCall工程所在的路径,图2-3-1 添加MyDll.lib和MyDll.dll文件在dllCall源文件下执行下列代码:#include #pragma comment(lib,MyDll.lib)/.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息extern C _declspec(dllimport) multi(int x,int y);int main(int argc, char* argv )int resul
22、t = multi(3,5);printf(静态调用结果:%dn,result);return 0;编译运行,运行结果如下:图2-3-2 运行结果由上述代码可以看出,静态调用方式的顺利进行需要完成两个动作:(1) 告诉编译器与DLL相对应的.lib文件所在的路径及文件名,#pragma comment(lib,MyDll.lib)就是起这个作用。程序员在建立一个DLL文件时,连接器会自动为其生成一个对应的.lib文件,该文件包含了DLL 导出函数的符号名及序号(并不含有实际的代码)。在应用程序里,.lib文件将作为DLL的替代文件参与编译。(2) 声明导入函数,extern C _declsp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 环境 动态 链接 开发 应用
链接地址:https://www.31ppt.com/p-2385675.html