19.1 DLL基础--《Windows核心编程》
Windows 中最重要的三个DLL是:
- Kernel32.dll:包含的函数用来管理内存、进程以及线程
- User32.dll:包含的函数用来执行和用户界面相关的任务
- GDI32.dll:包含的函数用来绘制图像和显示文字
将DLL文件映射到进程空间有两种方法:隐式载入时链接、显示运行时链接
如下图,DLL创建过程以及应用程序隐式链接到DLL过程
导出变量、函数或者类,必须在其前面加上 __declspec(dllexport) 标识符。
如果时编写 C++ 代码,还应该加上 extern "C"。
extern "C"
__declspec(dllexport)
导入变量、函数或者类,必须在其前面加上 __declspec(dllimport) 标识符。
(1)何为导出
当 Microsoft 的C/C ++编译器看到变量、函数原型或C++类之前的 __declspec(dllexport) 修改符的时候,它就将某些附加信息嵌入产生的.obj文件中。当链接DLL的所有.obj文件时,链接程序将对这些信息进行分析。 当DLL被链接时,链接程序要查找关于输出变量、函数或C++类的信息,并自动生成一个.lib文件。该.lib文件包含一个DLL输出的符号列表。当然,如果要链接引用该DLL的输出符号的任何可执行模块,该.lib文件是必不可少的。除了创建.lib文件外,链接程序还要将一个导出符号表嵌入产生的DLL文件。这个导出节包含一个导出变量、函数和类符号的列表(按字母顺 序排列)。该链接程序还将能够指明在何处找到每个符号的相对虚拟地址(RVA)放入DLL模块。