Windows程序设计教程 教学课件 PPT 作者 郭皞岩 屈景辉 廖琪梅 第12章-MFC动态链接库

上传人:E**** 文档编号:89401106 上传时间:2019-05-24 格式:PPT 页数:61 大小:1.21MB
返回 下载 相关 举报
Windows程序设计教程 教学课件 PPT 作者 郭皞岩 屈景辉 廖琪梅 第12章-MFC动态链接库_第1页
第1页 / 共61页
Windows程序设计教程 教学课件 PPT 作者 郭皞岩 屈景辉 廖琪梅 第12章-MFC动态链接库_第2页
第2页 / 共61页
Windows程序设计教程 教学课件 PPT 作者 郭皞岩 屈景辉 廖琪梅 第12章-MFC动态链接库_第3页
第3页 / 共61页
Windows程序设计教程 教学课件 PPT 作者 郭皞岩 屈景辉 廖琪梅 第12章-MFC动态链接库_第4页
第4页 / 共61页
Windows程序设计教程 教学课件 PPT 作者 郭皞岩 屈景辉 廖琪梅 第12章-MFC动态链接库_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《Windows程序设计教程 教学课件 PPT 作者 郭皞岩 屈景辉 廖琪梅 第12章-MFC动态链接库》由会员分享,可在线阅读,更多相关《Windows程序设计教程 教学课件 PPT 作者 郭皞岩 屈景辉 廖琪梅 第12章-MFC动态链接库(61页珍藏版)》请在金锄头文库上搜索。

1、Windows程序设计教程,第12章 MFC动态链接库,动态链接库在Windows中非常重要,几乎所有的Windows API函数都包含在动态链接库中。 动态链接库有很多优点,如节省内存、支持多语种等,特别是当动态链接库(DLL)中的函数改变后,只要不是参数改变,调用这个函数的应用程序就不需要重新编译,这在编程时是十分有用的。,12.1 DLL基本理论,在Windows操作系统中,几乎所有的内容都是以DLL的形式存在的。 例如显示的字体和图标存储在GDI.DLL中;显示Windows桌面、处理用户输入所需要的代码被存储在User.DLL中;Windows编程所需要的大量API函数存储在Kern

2、el.DLL中。,12.1.1 DLL基本概念,应用程序要从目标代码(.obj)外部引用函数,可以通过两种途径实现静态链接和动态链接。,1静态链接,该种方式下,链接程序首先对库文件(.lib)进行搜索,直到在某个库中,找到包含函数的对象模块为止。 然后,链接程序把这个对象模块复制到可执行文件(.exe)中。 链接程序负责维护对该函数的所有引用。,2动态链接,该种方式下,链接程序同样先对库文件(.lib)进行搜索,直到在某个库中,找到所引用函数的输入记录为止。,动态链接库主要有如下优点: (1)系统中,同时运行的多个应用程序可以同时使用同一个动态链接库,它们在内存中共享DLL文件的一个拷贝。 这

3、样做不仅节省了内存,而且减少了文件的动态交换。,(2)只要编写的应用程序的函数变量、返回值的类型、数量不发生变化,动态链接库的函数可以不用重新编译链接,直接使用。 (3)只要遵循一定的规则,不同语言编写的应用程序可以调用同一个动态链接库。,12.1.2 DLL的分类,微软的Visual C+支持3种DLL,它们分别是Non-MFC DLL(非MFC DLL)、Regular DLL(常规DLL)和Extension DLL(扩展DLL)。,1Non-MFC DLL(非MFC DLL) 2Regular DLL(常规DLL) 3Extension DLL(扩展DLL),12.1.3 DLL的工作

4、原理,应用程序打开动态链接库时,把动态链接库的执行代码映射到进程的地址空间中,这里的进程包括了使用动态链接库的每一个进程。 而动态链接库中的数据,应用程序则不是通过映射方式获取,而是做了一个备份。,也就是说动态链接库所有的执行代码是共享的,但其中的变量,每个应用程序均备份了一份。,1文件映射 2引用表 3内存分配,12.2 简单DLL示例,DLL现在越来越容易编写,Win32已经大大简化了其编程模式,并有许多来自AppWizard和MFC类库的支持。 本节将从一个简单的非MFC DLL实例入手,讨论DLL的一些主要编程思想。,12.2.1 一个简单的DLL,1DLL的编程实现,图12.1 工程

5、向导,2DLL调用的编程实现 3例程分析,图12.2 对话框窗口设计,图12.3 程序运行结果,12.2.2 导出函数,DLL文件中包含一个导出函数表,给出了DLL中每个导出函数的名字和标识号。 另外,函数表中还包含了DLL中函数的地址。 动态链接过程将在加载DLL模块时,动态建立一个函数调用与函数地址的对应表。,因此,如果没有改变导出函数的名字和参数序列,则重新编译或重建DLL文件时并不需要修改应用程序。,从DLL导出函数主要有两种方式: (1)创建模块定义文件(.def),并把导出函数名加入模块定义文件中; (2)在定义函数时使用_declspec(dllexport)关键字。,1使用模块

6、定义文件导出函数,模块定义文件是一个由多个语句组成的文本文件,根据不同的DLL,其模块定义语句可以不同,但一般来说必须包含以下语句:,(1)LIBRARY语句。 (2)DESCRIPTION语句。 (3)EXPORTS语句。,2使用_declspec(dllexport)关键字输出DLL,用户可以使用_declspec(dllexport)关键字输出DLL里的数据、函数、类等,这样就不再需要DEF文件了。,12.2.3 导入函数,DLL中实现了导出函数,而在应用程序中,必须声明相应的导入函数。 不论DLL中采用的是DEF文件输出方式,还是_declspec(dllexport)输出方式,在应用

7、程序中都可以用_declspec(dllimport)关键字来导入函数。,采用_declspec(dllimport)关键字导入函数MyFunction(),实现如下: void_declspec(dllimport) MyFunction();,12.3 访问动态链接库,在应用程序中访问DLL,实际上就是将应用程序中的导入函数与DLL文件中的导出函数进行链接。 有两种链接方式:隐式链接和显式链接。,隐式链接是指通过编译器,给应用程序提供DLL的名称和DLL函数的链接地址;显式链接则由应用程序通过代码加载DLL,编译器不需要知道任何关于DLL的信息。,12.3.1 隐式链接,要实现对DLL的隐

8、式链接,应用程序要从DLL提供者处获得以下3个文件: (1)包含有关DLL输出函数声明的头文件; (2)DLL的导入库(.LIB)文件; (3)动态链接库(.DLL)文件。,12.3.2 显式链接,显式链接方式要求应用程序以函数的形式实时地装入DLL,其实现过程可表示如下: (1)调用Win32的LoadLibary()函数,指定DLL的路径作为参数,函数将返回DLL模块的句柄;,(2)调用GetProcAddress()函数,获取应用程序希望访问的DLL函数的入口指针; (3)通过DLL函数指针访问DLL函数; (4)当DLL使用完后,调用FreeLibrary()函数来卸载DLL。,1获取

9、DLL的句柄 2获取函数的内存地址 3卸载动态链接库 4判断动态链接库是否被装入系统 5显示链接示例,6链接方式的选择,采用隐式链接,应用程序EXE文件被加载时,会将其调用的所有DLL文件加载在到内存中;但如果采用显式链接,程序员可以决定DLL文件何时加载或不加载。 也就是说,显式链接在运行时决定加载哪个DLL文件。,12.4 常规DLL,MFC中的常规DLL可分为两种静态链接到MFC的常规DLL和动态链接到MFC的常规DLL。 二者的区别是:前者使用的是MFC的静态链接库,生成的DLL文件长度大;后者使用MFC的动态链接库,生成的DLL文件长度小。,12.4.1 静态链接到MFC的常规DLL

10、,1利用MFC AppWizard生成工程 2添加实现代码 3编译链接,图12.4 工程向导,图12.5 选择DLL类型,12.4.2 动态链接到MFC的常规DLL,1利用MFC AppWizard生成工程 2添加实现代码 3编译链接,图12.6 选择DLL类型,12.4.3 DLL的链接使用,应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。,隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。 实现隐式链接很容易,只要将导入函数的关键字_declspec(dllimport)和函数名写到应用程序对应的头文件中即可。,而后就可以直接使用函数MsgBox()。 与

11、隐式链接相比,显式链接具有更好的灵活性。,1生成工程 2创建资源 3添加代码 4编译运行,图12.7 TestDLL窗体设计,图12.8 链接StaticMFCDll.dll结果,图12.9 链接ShareMFCDill.dll结果,12.5 扩展DLL,MFC中扩展DLL的特点是用来建立MFC的派生类,该DLL只能被用MFC类库所编写的应用程序调用。 扩展DLL和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,编译器创建了一个DLL入口函数DLLMain(),可以在此函数中实现DLL的初始化。,同样可以通过MFC AppWizarddll方式生成扩展DLL,和MFC常规DLL

12、一样,下面同样实现一个扩展DLL,其导出函数为MsgBox(),弹出一个对话框,显示创建的DLL的类型(即扩展MFC DLL)。,12.5.1 生成DLL,1建立工程 2添加代码 3编译运行,图12.10 选择DLL类型,12.5.2 链接DLL,和常规MFC DLL的链接实例一样,这里也采用显式链接。,图12.11 测试链接程序运行窗体,图12.12 链接ExtentionDLL.dll结果,小 结,本章主要介绍了MFC常规DLL和扩展DLL。 常规DLL又可细分成静态链接到MFC的DLL和动态链接到MFC的DLL两种。 扩展DLL是用MFC的动态链接版本所创建的,只被用MFC类库所编写的应用程序所调用。,本章在介绍DLL基本原理的基础上,着重讲解了DLL的编程思想,重点介绍了常规DLL和扩展DLL的基本概念及其创建、调用过程,并给出了相关的开发、调用实例。,上机指导,实验一:创建一个简单的DLL 实验内容 创建一个简单的DLL,对输入的数值进行乘法运算。 实验目的 熟悉创建DLL的过程与步骤。,实现思路 参照12.2节例子,创建一个DLL。但是计算两个数值的乘法的代码,需要读者重新编写。,实验二:显式链接 实验内容 显式链接实验一创建的DLL。 实验目的 熟悉显式链接的过程与常用的链接函数。,实现思路 参照12.3.2节中示例的链接步骤,与实验一创建的DLL创建链接。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号