实用软件工具与环境 第4章 动态连接库
description
Transcript of 实用软件工具与环境 第4章 动态连接库
实用软件工具与环境
第 4 章 动态连接库
诀窍详细内容请参阅谭德强 姜波主编
《实用软件工具与环境— C++高级编程》
本章主要教学内容 什么是动态连接库( DLL ) 动态连接库有哪些种类,各有些什么特点 如何在 Visual C++ 中生成和使用动态连接
库 利用 Visual C++ 软件开发环境编制一个
DLL 程序的实例
第 4 章 动态连接库4.1 动态连接库( DLL )概述4.2 DLL 的基本理论4.3 用 VC++ 开发环境生成 DLL4.4 使用 DLL4.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获取导出函数指针函数: GetProcAddressDLL 的卸载函数: 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 的类型及它们的特点创建动态连接库程序及测试程序事例
4.7 思考与练习
序号
⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩