`

DLL基础——Windows核心编程学习手札之十九

阅读更多

DLL基础

——Windows核心编程学习手札之十九

Windows API中的所有函数都包含在DLL中,3个最重要的DLLKernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll包含用于画图和显示文本的各个函数。Windows还配有若干别的DLL,用于执行一些特殊任务,如AdvAPI32.dll包含用于实现对象安全性、注册表操作和事件记录的函数;ComDlg32.dll包含常用对话框(如File OpenFile Save);ComCtl32.dll则支持所有的常用窗口控件。

DLL中通常没有用来处理消息循环或创建窗口的支持代码,DLL只是一组源代码模块,每个模块包含了应用程序(可执行文件)或另一个DLL将要调用的一组函数。当所有源代码文件编译后,它们就像应用程序的可执行文件那样被链接程序所链接。对于一个DLL,需要设定链接程序的/DLL开关,该开关使得链接程序能够向产生的DLL文件映像发出稍有不同的信息,如此,操作系统加载程序就能将该文件映像视为一个DLL而不是应用程序。在应用程序或另一个DLL能够调用DLL中的函数之前,DLL文件映像必须被映射到调用进程的地址空间中,可选用加载时的隐含连接和运行期的显示连接。一旦DLL的文件映像被映射到调用进程的地址空间中,DLL的函数就可以供进程中运行的所有线程使用。

创建DLL模块步骤:

1)先创建一个头文件,包含从DLL输出的函数原型、结构和符号,DLL的所有源代码模块均包含该头文件、以帮助创建DLL

2)要创建一个C/C++源代码模块(或多个模块),用于实现在DLL模块中的函数和变量;

3)创建DLL模块,编译器对每个源代码模块进行处理,产生.obj模块;

4)所有.obj模块创建完成后,链接程序将所有.obj模块内容组合在一起,产生一个DLL映像文件,包含用于DLL的所有二进制代码和全局/静态数据变量;

5)如果链接程序发现DLL的源代码模块至少输出了一个函数或变量,那么链接程序也生成一个.lib文件,列出所有已输出函数和变量的符号名;

创建可执行模块(调用DLL)步骤:

6)在引用函数、变量、数据、结构或符号的所有源代码模块中,必须包含DLL开发人员创建的头文件;

7)要创建一个C/C++源代码模块(或多个模块),在可执行模块中实现DLL中的函数和变量;

8)创建可执行模块,编译器生成.obj模块,链接程序组合.obj生成可执行的映像文件;

运行可执行模块(调用DLL),操作系统的加载程序执行步骤:

9)加载程序为新进程创建一个虚拟地址空间,可执行模块被映射到新进程的地址空间,加载程序对可执行模块的输入进行分析。对于列出的每个DLL名字,加载程序找出用户系统上的DLL模块,再将该DLL映射到进行的地址空间。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics