270 likes | 481 Views
第 10 章 动态链接库. 动态链接库的基本概念 动态链接库的创建 动态链接库的使用. 动态链接库的基本概念. 动态链接库 (DLLs) 是从 C 语言函数库和 Pascal 库单元的概念发展而来的。 几乎所有的 Windows API 都包含在 DLL 中 是可执行文件 , 它包含函数 , 数据或资源等其他应用程序可用到的东西 它可以在需要的时候随时装入 , 在装入时或运行时.
E N D
第10章 动态链接库 民政学院软件学院 蒋国清
动态链接库的基本概念 • 动态链接库的创建 • 动态链接库的使用 民政学院软件学院 蒋国清
动态链接库的基本概念 • 动态链接库(DLLs)是从C语言函数库和Pascal库单元的概念发展而来的。 • 几乎所有的Windows API都包含在DLL中 • 是可执行文件,它包含函数,数据或资源等其他应用程序可用到的东西 • 它可以在需要的时候随时装入, 在装入时或运行时 民政学院软件学院 蒋国清
自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着。自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着。 • 显示的字体和图标存储在GDI.DLL中 • 显示Windows桌面和处理用户的输入所需要的代码被存储在一个User.DLL中 • Windows编程所需要的大量的API函数也被包含在Kernel.DLL中 民政学院软件学院 蒋国清
静态链接库 • 多个应用程序,多个静态链接库的副本 • 占用较多的内存资源 • 在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB) • Visual C++的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件 民政学院软件学院 蒋国清
"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行 民政学院软件学院 蒋国清
DLL可在函数调用其中的函数时,才被装入内存 • DLL在内存中的一个副本可供多个应用程序使用 • 减少了内存和磁盘空间 • DLL是包含若干函数、类或资源的库文件 • 函数和数据被存储在一个DLL上 ,可供其它DLL或应用程序使用 民政学院软件学院 蒋国清
DLL的优点 • 共享DLL,节省内存,减少动态交换 • 不同程序设计语言之间可以共享DLL • 减少可执行代码大小 • 重用代码 • 大工程可分为易管理的小工程 • 实现新功能更容易、软件升级 民政学院软件学院 蒋国清
在动态库的情况下,有两个文件 • 引入库(.LIB)文件 • DLL文件 • 引入库文件包含被DLL导出的函数的名称和位置 • DLL包含实际的函数和数据 • 应用程序使用LIB文件链接到所需要使用的DLL文件 民政学院软件学院 蒋国清
动态链接库的创建 • Win32 Dynamic-Link Library方式 • 使用导出函数关键字_declspec(dllexport)创建 • 用.def文件创建 • 微软的Visual C++支持三种DLL • Non-MFC Dll(非MFC动态库) • Regular Dll(常规DLL) • Extension Dll(扩展DLL) 民政学院软件学院 蒋国清
Win32 Dynamic-Link Library方式 (1)使用导出函数关键字_declspec(dllexport)创建 //Win32DLL.hextern "C" _declspec(dllexport) int Max(int a, int b);extern "C" _declspec(dllexport) int Min(int a, int b); //Win32DLL.cpp #include"Win32DLL.h" int Max(int a, int b) { return (a>=b)?a:b; } int Min(int a, int b) { return (a<=b)?a:b; } 民政学院软件学院 蒋国清
查看Debug目录,生成了两个文件 • Win32DLL.dll • Win32DLL.lib 民政学院软件学院 蒋国清
(2)用.def文件创建 • 删除头文件和实现文件中的包含部分 • 建立一个新文本文件Win32DLL_DEF.def 民政学院软件学院 蒋国清
DEF文件的格式 • LIBRARY Win32DLL_Def • EXPORTS • Max :Max@1 • Min :Min@2 民政学院软件学院 蒋国清
实现文件 • //Win32DLL_DEF.cpp int Max(int a, int b) { return (a>=b)?a:b; } int Min(int a, int b) { return (a<=b)?a:b; } 民政学院软件学院 蒋国清
MFC AppWizard[dll]方式生成常规/扩展DLL • 常规DLL静态链接到MFC • 常规DLL动态链接到MFC • MFC扩展DLL 民政学院软件学院 蒋国清
MFC生成框架 • 可以使用MFC类 • 其它与Non-MFC大同小异 民政学院软件学院 蒋国清
DLL的发布 • *.h • *.lib • *.dll 民政学院软件学院 蒋国清
DLL的使用 • 隐式链接 • 显式链接 民政学院软件学院 蒋国清
要先将MyDll.dll和MyDll.lib拷贝到某目录下面 • Windows系统将遵循下面的搜索顺序来定位DLL: • 1.包含EXE文件的目录 • 2.进程的当前工作目录 • 3.Windows系统目录 • 4.Windows目录 • 5.列在Path环境变量中的一系列目录 民政学院软件学院 蒋国清
隐式链接 • _declspec(dllimport) • //*.h • #pragma comment(lib,"MyDll.lib")extern "C"_declspec(dllimport) int Max(int a,int b);extern "C"_declspec(dllimport) int Min(int a,int b); • //*.cpp • #include"Dlltest.h"… Int x=Min(100,200); 民政学院软件学院 蒋国清
显式链接 • 显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。 • 实现显式链接要麻烦一些。 民政学院软件学院 蒋国清
跟显式链接相关的函数 • HINSTANCE LoadLibrary( LPCTSTR lpLibFileName); • FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName); • BOOL FreeLibrary( HMODULE hLibModule); 民政学院软件学院 蒋国清
typedef int(*pMax)(int a,int b); • typedef int(*pMin)(int a,int b); • HINSTANCE hDLL; • pMax Max; • hDLL=LoadLibrary("Win32DLL.dll");//加载动态链接库Win32DLL.dll文件; • if(!hDLL) • { • MessageBox("装入动态链接库失败!"); • return ; • } • Max=(pMax)GetProcAddress(hDLL,"Max"); • if(!Max) • { • MessageBox("获取函数地址失败!"); • return ; • } • int A=Max(5,8); • CString x; • x.Format("较大数是%d!",A); • MessageBox(x); • if(!FreeLibrary(hDLL))//卸载Win32DLL.dll文件; • MessageBox("关闭Win32DLL.dll失败"); 民政学院软件学院 蒋国清
使用显式链接应用程序编译时不需要使用相应的Lib文件 • 关键字typedef,定义指向和DLL中相同的函数原型指针 • GetProcAddress(hDLL,“Min”)改为 • GetProcAddress(hDLL, MAKEINTRESOURCE(2)) 民政学院软件学院 蒋国清
dumpbin • usage: DUMPBIN [options] [files] • options: • /ALL • /ARCH • /ARCHIVEMEMBERS • /DEPENDENTS • /DIRECTIVES • /DISASM • /EXPORTS • /FPO • /HEADERS • /IMPORTS • /LINENUMBERS • /LINKERMEMBER[:{1|2}] • /LOADCONFIG • /OUT:filename • /PDATA • /RAWDATA[:{NONE|BYTES|SHORTS|LONGS}[,#]] • /RELOCATIONS • /SECTION:name • /SUMMARY • /SYMBOLS 民政学院软件学院 蒋国清
DLL的概述 • DLL的创建 • DLL的使用 民政学院软件学院 蒋国清