Windows中最重要的DLL文件:
Kernel32.dll(kernel核心):负责管理内存、进程和线程的函数
User32.dll:包含处理用户界面的函数
GDI32.dll:包含绘制图形和显示文本的函数
AdvAPI32.dll:包含有关对象安全性、注册表操作以及事件日志等函数
ComDlg32.dll:包含常用对话框(如文件打开和保存)
ComCtl32.dll:支持所有常用的窗口控件
建立一个DLL的步骤:
1. 创建一个头文件,包含要从DLL文件中导出的函数原型、结构以及符号,DLL的所有源代码模块都要包含盖头文件。
2. 创建一个或多个源代码块,实现函数和变量。
3. 用编译器处理每个源代码模块,对应每个源代码块生成一个.obj模块。
4. 连接程序将所有的.obj模块组合在一起,生成一个单独的DLL映像文件。该映像文件包含了用于DLL的所有二进制代码和全局/静态数据变量。
5. 如果连接程序检测到DLL源代码模块至少导出了一个函数或变量,这连接程序同时生成一个.lib文件,该文件列出了导出的函数和变量名。
一旦创建了DLL模块,就可以创建可执行模块了:
6. 在所有引用变量、函数、数据结构或者符号的源代码中,包含创建DLL时所建立的头文件。
7. 创建一个或多个源代码模块,用以实现想要在可执行模块中实现的函数和变量。
8. 创建可执行模块,用编译器来处理每个源代码模块,对应每个源代码块生成一个.obj模块。
9. 当所有的.obj模块都已经生成完后,连接程序将所有的.obj模块组合在一起,生成一个单独的可执行映像文件。该映像文件包含了用于可执行模块的所有二进制代码和全局/静态数据变量。可执行模块同时也包含了一个导入部分,列出了该可执行模块所需要的所有DLL模块的名字。另外,对于每个DLL模块,该可导入部分指明了哪些函数和变量符号可以被可执行文件的二进制代码所引用。
当建立完成了DLL和可执行模块,就可以创建一个进程了。
当试图运行一个可执行模块时,操作系统的装载程序执行以下步骤:
为新进程创建一个虚拟地址空间,可执行模块被映射到新进程的地址空间,装载程序解析可执行模块的导入部分,对于在导入部分列出的每个DLL名,装载程序在用户系统中定位DLL模块,并将DLL模块映射到进程的地址空间中,当完成所有的映射工作后,应用程序就可以运行了。
通过微软的DUMPBIN.exe可以看到导出的DLL模块的部分代码片段,例如:
RVA(relativevirtual address):相对虚拟地,用来指明可以在什么位置找到每个符号(导出符号在DLL文件映像中的偏移量)。
ordinal(序数)列是为了是为了与16位windows源代码进行向后兼容的,这在当前的应用程序中不应当使用。
hint列是系统用来提高应用程序性能的。