200 likes | 371 Views
实用软件工具与环境 第4章 动态连接库. 诀窍 详细内容请参阅谭德强 姜波主编 《 实用软件工具与环境— C++ 高级编程 》. 本章主要教学内容. 什么是动态连接库( DLL ) 动态连接库有哪些种类,各有些 什么特点 如何在 Visual C++ 中生成和使用动态连接库 利用 Visual C++ 软件开发环境编制一个 DLL 程序的实例. 第4章 动态连接库. 4.1 动态连接库( DLL) 概述 4.2 DLL 的基本理论 4.3 用 VC++ 开发环境生成 DLL 4.4 使用 DLL 4.5 用 VC++ 开发 DLL 的编程事例
E N D
实用软件工具与环境第4章 动态连接库 诀窍 详细内容请参阅谭德强 姜波主编 《实用软件工具与环境—C++高级编程》
本章主要教学内容 • 什么是动态连接库(DLL) • 动态连接库有哪些种类,各有些什么特点 • 如何在Visual C++中生成和使用动态连接库 • 利用Visual C++软件开发环境编制一个 DLL 程序的实例
第4章 动态连接库 4.1 动态连接库(DLL)概述 4.2 DLL的基本理论 4.3 用VC++开发环境生成DLL 4.4 使用DLL 4.5 用VC++开发DLL的编程事例 4.6 本章小结 4.7 思考与练习
4.1 动态连接库(DLL)概述 • 作用: • 通过创建和使用DLL,可以方便地实现多个用户对DLL的共享(通过库文件和函数调用说明文件) • DLL类似C原文件,提供函数、资源和数据 • 通过DLL的使用可方便的实现应用程序的本地化 • DLL与可执行文件的区别和联系: • DLL要求一个DEF(模块定义文件) • DLL要求一个DllMain()的入口点 • DLL可以装入,但不能执行
4.1 动态连接库(DLL)概述(C) 4.1.1 DLL的定义 • DLL是应用程序中的一段程序,是一个可以从.exe文件中单独执行的模块。 • DLL是其它应用程序在执行时能够动态链接和调用的一组服务或函数。 • DLL是Windows程序设计非常有用的一种方法。
4.1 动态连接库(DLL)概述(C) 4.1.2 DLL的种类(由MFC AppWizard支持生成) • Win32 DLL • 空DLL工程 • 简单的DLL工程 • 导出变量、函数和类的DLL • MFC AppWizard DLL • 静态链接MFC的Regular DLL • 动态链接MFC的Regular DLL • 动态链接MFC的扩展(Extension) DLL
4.1 动态连接库(DLL)概述(C) 4.1.3 动态连接库和静态连接库的比较 • 区别: • 使用静态链接库,其函数代码包含在应用程序中 • 使用动态链接库,只需包含函数信息即可 • 动态链接库的优点: • 有利于程序共享 • 多个程序使用DLL的单一映射,节约内存空间 • 通过程序拆分,有利于程序升级 • 可以节约大量硬盘空间
4.2 DLL的基本理论 4.2.1 DLL的入出口函数 • 被系统调用,以完成DLL的初始化和终止工作。 ⒈DllMain函数 • 一般DLL的入出口函数,需自己编写代码 • 一个DLL调用和撤除时被调用 • 函数结构:p.85 ⒉MFC的Regular DLL入出口 • 由MFC提供,不必自己编写代码 • 装时调用InitInstance,卸时调用ExitInstance 应用程序使用LoadLibrary 和FreeLibrary等函数及进程、线程启动和终止时。
4.2 DLL的基本理论(C) 4.2.2 DLL的链接方式 ⒈隐式链接动态链接库 • 应用程序通过说明DLL的导入库文件(lib)链接,lib文件中包含一系列指向动态链接库的指针 • 应用程序必须获得的有关DLL的信息: • 包含导出函数以及类声明的头文件,需要知道函数名和函数接口信息 • DLL的导入库文件(应用程序编译链接时使用),使用Project|Add To Project/Setting选择lib文件 • 实际的DLL文件(应用程序运行时调用)
4.2 DLL的基本理论(C) 4.2.2 DLL的链接方式(C) ⒉显式链接动态链接库 • 应用程序在运行时通过函数调用显式装载和卸载DLL,并通过函数指针调用DLL的导出函数 • 函数使用的基本方式: • DLL的装载函数:LoadLibrary或AfxloadLibrary • 获取导出函数指针函数:GetProcAddress • DLL的卸载函数:FreeLibrary或AfxFreeLibrary
4.2 DLL的基本理论(C) 4.2.3 动态连接库库函数的导出 ⒈在源程序中使用关键字_declspec(dllexport) • 根据一个指定的存储类属性,存储某个项目数据。从动态连接库文件中输出数据、函数、类、类成员函数,而不需要DEF文件。 • 语法如下: _declspec(extended-attribute) declarator; • 在应用程序中使用关键字_declspec(dllimport)引入DLL中的数据、函数以及类
4.2 DLL的基本理论(C) 4.2.3 动态连接库库函数的导出(C) ⒉在DEF中通过EXPORTS来声明函数 • DEF是由一个或多个描述DLL属性的语句组成的文本文件,一般包括五个语句的描述项(P.88)。 • 库函数的声明如下: entryname[=internalname][@ordinal[NONAME]] ⒊其它方法 • 在LINK命令中用/EXPORT参数指定导出函数 • 在MFC扩展DLL中使用宏导出成员函数或整个类
4.2 DLL的基本理论(C) 4.2.4 从DLL中导出数据变量 ⒈使用DEF文件,设置关键字CONSTANT导出 ⒉在应用程序中使用如下关键字引入对DLL导出变量的使用:_declspec(dllimport)
4.3 用VC++开发环境生成DLL 4.3.1 用VisualC++生成Win32 DLL ⒈空DLL工程: • 不包括任何自动生成的文件 ⒉简单的DLL工程: • 自动生成只有一个默认的DllMain函数的主程序 ⒊导出变量、函数和类的DLL • 生成DllMain函数框架较为完整,定义了一个类 • 使用关键字_declspec()导出/导入函数 • 使用lib文件链接动态链接库
4.3 用VC++开发环境生成DLL 4.3.2 用VisualC++的MFC生成Win32DLL ⒈静态链接MFC的Regular DLL • 内部使用MFC的DLL库,建立时使用MFC静态库 • 自动生成入出口函数、DEF文件、C接口导出函数 ⒉动态链接MFC的Regular DLL(与⒈类似) • 建立时使用MFC动态库,调用函数使用特殊的宏 ⒊动态链接MFC的扩展(Extension)DLL • 从已有的MFC类派生新类的DLL,使用MFC动态库 • 导出函数只由使用MFC动态库的MFC应用程序调用
4.4 使用DLL 4.4.1 DLL的使用 ⒈DLL的查找位置:⒉DLL的通常存放位置 4.4.2 DLL的调试 ⒈使用应用程序调式DLL • Project|Settings|Debug|Category|Additional ⒉使用DLL的工程调式DLL • Project|Settings|Debug|Category|Additional ⒊同时使用应用程序和DLL的工程调式DLL • 将DLL工程添加到应用程序工作区中同时开发
4.5 用VC++开发DLL的编程事例 4.5.1 用MFC生成DLL ⒈动态连链库(DLL)工程的建立 ⒉创建测试动态链接库的应用程序
4.6 本章小结 • 动态连接库的基本概念(与静态连接库区别) • 动态连接库的基本理论(显示与隐式连接) • 动态连接库中库函数与变量的导出方式 • VisualC++中DLL的类型及它们的特点 • 创建动态连接库程序及测试程序事例
序号 ⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛ ⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇ ①②③④⑤⑥⑦⑧⑨⑩