第 10 章 动态链接库

27
Windows Windows 编编 编编 —— —— 10 10 第第第第第 第第第第第 06/08/22 06/08/22 编编编编编编编编 编编编 编编编编编编编编 编编编 10 10 编编编编编 编编编编编

Upload: randy

Post on 27-Jan-2016

128 views

Category:

Documents


0 download

DESCRIPTION

第 10 章 动态链接库. 动态链接库的基本概念 动态链接库的创建 动态链接库的使用. 动态链接库的基本概念. 动态链接库 (DLLs) 是从 C 语言函数库和 Pascal 库单元的概念发展而来的。 几乎所有的 Windows API 都包含在 DLL 中 是可执行文件 , 它包含函数 , 数据或资源等其他应用程序可用到的东西 它可以在需要的时候随时装入 , 在装入时或运行时. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

第第 1010 章 动态链接库章 动态链接库

Page 2: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

动态链接库的基本概念动态链接库的基本概念 动态链接库的创建动态链接库的创建 动态链接库的使用动态链接库的使用

Page 3: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

动态链接库的基本概念动态链接库的基本概念

动态链接库动态链接库 (DLLs)(DLLs) 是从是从 CC 语言函数库和语言函数库和 PPascalascal 库单元的概念发展而来的。库单元的概念发展而来的。

几乎所有的几乎所有的 Windows APIWindows API 都包含在都包含在 DLLDLL 中中 是可执行文件是可执行文件 ,, 它包含函数它包含函数 ,, 数据或资源等数据或资源等

其他应用程序可用到的东西其他应用程序可用到的东西 它可以在需要的时候随时装入它可以在需要的时候随时装入 , , 在装入时在装入时

或运行时或运行时

Page 4: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

自从微软推出自从微软推出 1616 位的位的 WindowsWindows 操作系统起,此操作系统起,此后每种版本的后每种版本的 WindowsWindows 操作系统都非常依赖于操作系统都非常依赖于动态链接库动态链接库 (DLL)(DLL) 中的函数和数据,实际上中的函数和数据,实际上 WinWindowsdows 操作系统中几乎所有的内容都由操作系统中几乎所有的内容都由 DLLDLL 以一以一种或另外一种形式代表着。种或另外一种形式代表着。

显示的字体和图标存储在显示的字体和图标存储在 GDI.DLLGDI.DLL 中中 显示显示 WindowsWindows 桌面和处理用户的输入所需要的桌面和处理用户的输入所需要的

代码被存储在一个代码被存储在一个 User.DLLUser.DLL 中中 WindowsWindows 编程所需要的大量的编程所需要的大量的 APIAPI 函数也被包函数也被包

含在含在 Kernel.DLLKernel.DLL 中中

Page 5: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

静态链接库静态链接库

多个应用程序,多个静态链接库的副本多个应用程序,多个静态链接库的副本 占用较多的内存资源占用较多的内存资源 在静态库情况下,函数和数据被编译进一在静态库情况下,函数和数据被编译进一

个二进制文件(通常扩展名为个二进制文件(通常扩展名为 *.LIB*.LIB )) Visual C++Visual C++ 的编译器在处理程序代码时将的编译器在处理程序代码时将

从静态库中恢复这些函数和数据并把他们从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成和应用程序中的其他模块组合在一起生成可执行文件 可执行文件

Page 6: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

"" 静态链接静态链接 "" ,此时因为应用程序所需的全,此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行 库本身并不需要与可执行文件一起发行

Page 7: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

DLLDLL 可在函数调用其中的函数时,才被装可在函数调用其中的函数时,才被装入内存入内存

DLLDLL 在内存中的一个副本可供多个应用程在内存中的一个副本可供多个应用程序使用序使用

减少了内存和磁盘空间减少了内存和磁盘空间 DLLDLL 是包含若干函数、类或资源的库文件 是包含若干函数、类或资源的库文件 函数和数据被存储在一个函数和数据被存储在一个 DLLDLL 上 ,可供其上 ,可供其

它它 DLLDLL 或应用程序使用或应用程序使用

Page 8: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

DLLDLL 的优点的优点

共享共享 DLLDLL ,节省内存,减少动态交换,节省内存,减少动态交换 不同程序设计语言之间可以共享不同程序设计语言之间可以共享 DLLDLL 减少可执行代码大小减少可执行代码大小 重用代码重用代码 大工程可分为易管理的小工程大工程可分为易管理的小工程 实现新功能更容易、软件升级实现新功能更容易、软件升级

Page 9: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

在动态库的情况下,有两个文件在动态库的情况下,有两个文件• 引入库(引入库( .LIB.LIB )文件)文件• DLLDLL 文件 文件

引入库文件包含被引入库文件包含被 DLLDLL 导出的函数的名称导出的函数的名称和位置 和位置

DLLDLL 包含实际的函数和数据 包含实际的函数和数据 应用程序使用应用程序使用 LIBLIB 文件链接到所需要使用文件链接到所需要使用

的的 DLLDLL 文件 文件

Page 10: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

动态链接库的创建动态链接库的创建

Win32 Dynamic-Link LibraryWin32 Dynamic-Link Library 方式 方式 • 使用导出函数关键字使用导出函数关键字 _declspec(dllexport)_declspec(dllexport) 创创

建 建 • 用用 .def.def 文件创建 文件创建

微软的微软的 Visual C++Visual C++ 支持三种支持三种 DLL DLL • Non-MFC DllNon-MFC Dll (非(非 MFCMFC 动态库)动态库)• Regular DllRegular Dll (常规(常规 DLLDLL ))• Extension DllExtension Dll (扩展(扩展 DLLDLL ) )

Page 11: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

Win32 Dynamic-Link LibraryWin32 Dynamic-Link Library 方方式式

(1)(1) 使用导出函数关键字使用导出函数关键字 _declspec(dllexport)_declspec(dllexport) 创建 创建 //Win32DLL.h//Win32DLL.h

extern "C" _declspec(dllexport) int Max(int a, int b);extern "C" _declspec(dllexport) int Max(int a, int b);extern "C" _declspec(dllexport) int Min(int a, int b);extern "C" _declspec(dllexport) int Min(int a, int b);

//Win32DLL.cpp//Win32DLL.cpp#include"Win32DLL.h"#include"Win32DLL.h"int Max(int a, int b)int Max(int a, int b){{ return (a>=b)?a:b; return (a>=b)?a:b; }}int Min(int a, int b)int Min(int a, int b){ { return (a<=b)?a:b; return (a<=b)?a:b; }}

Page 12: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

查看查看 DebugDebug 目录,生成了两个文件目录,生成了两个文件• Win32DLL.dllWin32DLL.dll• Win32DLL.lib Win32DLL.lib

Page 13: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

(2)(2) 用用 .def.def 文件创建文件创建• 删除头文件和实现文件中的包含部分删除头文件和实现文件中的包含部分• 建立一个新文本文件建立一个新文本文件 Win32DLL_DEF.defWin32DLL_DEF.def

Page 14: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

DEFDEF 文件的格式文件的格式• LIBRARY Win32DLL_DefLIBRARY Win32DLL_Def• EXPORTSEXPORTS• MaxMax :Max@1:Max@1• MinMin :Min@2:Min@2

Page 15: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

实现文件实现文件 //Win32DLL_DEF.cpp//Win32DLL_DEF.cpp

int Max(int a, int b)int Max(int a, int b){{ return (a>=b)?a:b; return (a>=b)?a:b; }}int Min(int a, int b)int Min(int a, int b){ { return (a<=b)?a:b; return (a<=b)?a:b; }}

Page 16: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

MFC AppWizard[dll]MFC AppWizard[dll]方式生成常规方式生成常规 // 扩展扩展DLLDLL• 常规常规 DLLDLL 静态链接到静态链接到 MFC MFC • 常规常规 DLLDLL 动态链接到动态链接到 MFC MFC • MFCMFC 扩展扩展 DLL DLL

Page 17: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

MFCMFC 生成框架生成框架 可以使用可以使用 MFCMFC 类类 其它与其它与 Non-MFCNon-MFC 大同小异大同小异

Page 18: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

DLLDLL 的发布的发布

*.h*.h *.lib*.lib *.dll*.dll

Page 19: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

DLLDLL 的使用的使用

隐式链接隐式链接 显式链接显式链接

Page 20: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

要先将要先将 MyDll.dllMyDll.dll 和和 MyDll.libMyDll.lib拷贝到某目录下面 拷贝到某目录下面 WindowsWindows系统将遵循下面的搜索顺序来定位系统将遵循下面的搜索顺序来定位 DLLDLL::

• 11.包含.包含 EXEEXE 文件的目录文件的目录• 22.进程的当前工作目录.进程的当前工作目录• 33.. WindowsWindows系统目录系统目录• 44 .. WindowsWindows 目录目录• 55 .列在.列在 PathPath环境变量中的一系列目录环境变量中的一系列目录

Page 21: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

隐式链接隐式链接

_declspec(dllimport) _declspec(dllimport) //*.h//*.h #pragma comment(lib#pragma comment(lib ,, "MyDll.lib")"MyDll.lib")

extern "C"_declspec(dllimport) int Max(int a,int b);extern "C"_declspec(dllimport) int Max(int a,int b);extern "C"_declspec(dllimport) int Min(int a,int b);extern "C"_declspec(dllimport) int Min(int a,int b);

//*.cpp//*.cpp #include"Dlltest.h"#include"Dlltest.h"……

Int x=Min(100,200);Int x=Min(100,200);

Page 22: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

显式链接显式链接

显式链接是应用程序在执行过程中随时可显式链接是应用程序在执行过程中随时可以加载以加载 DLLDLL 文件,也可以随时卸载文件,也可以随时卸载 DLLDLL 文文件,这是隐式链接所无法作到的,所以显件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语式链接具有更好的灵活性,对于解释性语言更为合适。 言更为合适。

实现显式链接要麻烦一些。 实现显式链接要麻烦一些。

Page 23: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

跟显式链接相关的函数跟显式链接相关的函数 HINSTANCE LoadLibrary( LPCTSTRHINSTANCE LoadLibrary( LPCTSTR lpLibFileName lpLibFileName);); FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpPrFARPROC GetProcAddress( HMODULE hModule, LPCSTR lpPr

ocName);ocName); BOOL FreeLibrary( HMODULE hLibModule); BOOL FreeLibrary( HMODULE hLibModule);

Page 24: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

typedef int(*pMax)(int a,int b);typedef int(*pMax)(int a,int b); typedef int(*pMin)(int a,int b);typedef int(*pMin)(int a,int b); HINSTANCE hDLL;HINSTANCE hDLL; pMax Max;pMax Max; hDLL=hDLL=LoadLibrary("Win32DLL.dll")LoadLibrary("Win32DLL.dll");//;// 加载动态链接库加载动态链接库 Win32DLL.dllWin32DLL.dll 文件;文件; if(!hDLL)if(!hDLL) {{ MessageBox("MessageBox(" 装入动态链接库失败装入动态链接库失败 !");!"); return ;return ; } } MaxMax=(pMax)GetProcAddress(hDLL,"Max");=(pMax)GetProcAddress(hDLL,"Max"); if(!Max) if(!Max) {{ MessageBox("MessageBox(" 获取函数地址失败获取函数地址失败 !");!"); return ;return ; } } int int A=Max(5,8);A=Max(5,8); CString x;CString x; x.Format("x.Format(" 较大数是较大数是 %d!",A);%d!",A); MessageBox(x);MessageBox(x); ifif(!(!FreeLibrary(hDLLFreeLibrary(hDLL)))//)//卸载卸载 Win32DLL.dllWin32DLL.dll 文件;文件; MessageBox("MessageBox(" 关闭关闭 Win32DLL.dllWin32DLL.dll 失败失败 ");");

Page 25: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

使用显式链接应用程序编译时不需要使用使用显式链接应用程序编译时不需要使用相应的相应的 LibLib 文件 文件

关键字关键字 typedeftypedef ,定义指向和,定义指向和 DLLDLL 中相同中相同的函数原型指针的函数原型指针

GetProcAddress(hDLL,“Min”)GetProcAddress(hDLL,“Min”)改为改为 GetProcAddress(hDLL, MAKEINTRESOURCE(2)) GetProcAddress(hDLL, MAKEINTRESOURCE(2))

Page 26: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

dumpbindumpbin

• usage: DUMPBIN [options] [files]usage: DUMPBIN [options] [files]

• options:options:

• /ALL/ALL• /ARCH/ARCH• /ARCHIVEMEMBERS/ARCHIVEMEMBERS• /DEPENDENTS/DEPENDENTS• /DIRECTIVES/DIRECTIVES• /DISASM/DISASM• /EXPORTS/EXPORTS• /FPO/FPO• /HEADERS/HEADERS• /IMPORTS/IMPORTS• /LINENUMBERS/LINENUMBERS• /LINKERMEMBER[:{1|2}]/LINKERMEMBER[:{1|2}]• /LOADCONFIG/LOADCONFIG• /OUT:filename/OUT:filename• /PDATA/PDATA• /RAWDATA[:{NONE|BYTES|SHORTS|LONGS}[,#]]/RAWDATA[:{NONE|BYTES|SHORTS|LONGS}[,#]]• /RELOCATIONS/RELOCATIONS• /SECTION:name/SECTION:name• /SUMMARY/SUMMARY• /SYMBOLS/SYMBOLS

Page 27: 第 10 章  动态链接库

《 《 WindowsWindows 编程编程》——》——第第 1010 章 动态链接库章 动态链接库

04/21/2304/21/23民政学院软件学院 蒋国清民政学院软件学院 蒋国清

DLLDLL 的概述的概述 DLLDLL 的创建的创建 DLLDLL 的使用的使用