欢迎来到天天文库
浏览记录
ID:50030259
大小:1.01 MB
页数:60页
时间:2020-03-07
《Windows程序设计教程 第2版 教学课件 作者 王秀梅 第12章-MFC动态链接库.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、动态链接库在Windows中非常重要,几乎所有的WindowsAPI函数都包含在动态链接库中。动态链接库有很多优点,如节省内存、支持多语种等,特别是当动态链接库(DLL)中的函数改变后,只要不是参数改变,调用这个函数的应用程序就不需要重新编译,这在编程时是十分有用的。DLL基本理论12.1简单DLL示例12.2访问动态链接库12.3常规DLL12.4扩展DLL12.512.1DLL基本理论在Windows操作系统中,几乎所有的内容都是以DLL的形式存在的。例如显示的字体和图标存储在GDI.DLL
2、中;显示Windows桌面、处理用户输入所需要的代码被存储在User.DLL中;Windows编程所需要的大量API函数存储在Kernel.DLL中。12.1.1DLL基本概念应用程序要从目标代码(.obj)外部引用函数,可以通过两种途径实现——静态链接和动态链接。1.静态链接该种方式下,链接程序首先对库文件(.lib)进行搜索,直到在某个库中,找到包含函数的对象模块为止。然后,链接程序把这个对象模块复制到可执行文件(.exe)中。链接程序负责维护对该函数的所有引用。2.动态链接该种方式下,链接
3、程序同样先对库文件(.lib)进行搜索,直到在某个库中,找到所引用函数的输入记录为止。动态链接库主要有如下优点:(1)系统中,同时运行的多个应用程序可以同时使用同一个动态链接库,它们在内存中共享DLL文件的一个拷贝。这样做不仅节省了内存,而且减少了文件的动态交换。(2)只要编写的应用程序的函数变量、返回值的类型、数量不发生变化,动态链接库的函数可以不用重新编译链接,直接使用。(3)只要遵循一定的规则,不同语言编写的应用程序可以调用同一个动态链接库。12.1.2DLL的分类微软的VisualC++
4、支持3种DLL,它们分别是Non-MFCDLL(非MFCDLL)、RegularDLL(常规DLL)和ExtensionDLL(扩展DLL)。1.Non-MFCDLL(非MFCDLL)2.RegularDLL(常规DLL)3.ExtensionDLL(扩展DLL)12.1.3DLL的工作原理应用程序打开动态链接库时,把动态链接库的执行代码映射到进程的地址空间中,这里的进程包括了使用动态链接库的每一个进程。而动态链接库中的数据,应用程序则不是通过映射方式获取,而是做了一个备份。也就是说动态链接库所
5、有的执行代码是共享的,但其中的变量,每个应用程序均备份了一份。1.文件映射2.引用表3.内存分配12.2简单DLL示例DLL现在越来越容易编写,Win32已经大大简化了其编程模式,并有许多来自AppWizard和MFC类库的支持。本节将从一个简单的非MFCDLL实例入手,讨论DLL的一些主要编程思想。12.2.1一个简单的DLL1.DLL的编程实现图12.1工程向导2.DLL调用的编程实现3.例程分析图12.2对话框窗口设计图12.3程序运行结果12.2.2导出函数DLL文件中包含一个导出函数表
6、,给出了DLL中每个导出函数的名字和标识号。另外,函数表中还包含了DLL中函数的地址。动态链接过程将在加载DLL模块时,动态建立一个函数调用与函数地址的对应表。因此,如果没有改变导出函数的名字和参数序列,则重新编译或重建DLL文件时并不需要修改应用程序。从DLL导出函数主要有两种方式:(1)创建模块定义文件(.def),并把导出函数名加入模块定义文件中;(2)在定义函数时使用_declspec(dllexport)关键字。1.使用模块定义文件导出函数模块定义文件是一个由多个语句组成的文本文件,根
7、据不同的DLL,其模块定义语句可以不同,但一般来说必须包含以下语句:(1)LIBRARY语句。(2)DESCRIPTION语句。(3)EXPORTS语句。2.使用_declspec(dllexport)关键字输出DLL用户可以使用_declspec(dllexport)关键字输出DLL里的数据、函数、类等,这样就不再需要DEF文件了。12.2.3导入函数DLL中实现了导出函数,而在应用程序中,必须声明相应的导入函数。不论DLL中采用的是DEF文件输出方式,还是_declspec(dllexpor
8、t)输出方式,在应用程序中都可以用_declspec(dllimport)关键字来导入函数。采用_declspec(dllimport)关键字导入函数MyFunction(),实现如下:void_declspec(dllimport)MyFunction();12.3访问动态链接库在应用程序中访问DLL,实际上就是将应用程序中的导入函数与DLL文件中的导出函数进行链接。有两种链接方式:隐式链接和显式链接。隐式链接是指通过编译器,给应用程序提供DLL的名称和DLL函数的链接地址;显式链接则由应用程
此文档下载收益归作者所有