关于DLL的一点笔记
来源:互联网 发布:php强迫其它帐号下线 编辑:程序博客网 时间:2024/06/05 16:53
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列是系统用来提高应用程序性能的。
- 关于DLL的一点笔记
- 关于DLL的一点信息
- 【转】关于DLL的一点介绍
- 关于.lib和.dll的一点说明
- 关于exe和dll的一点联想
- 关于BUG_ON()的一点笔记
- 关于Quartz的一点笔记
- 关于new的一点笔记
- 关于BUG_ON()的一点笔记
- 关于BUG_ON()的一点笔记
- 关于tar的一点笔记
- 关于 的一点笔记
- 关于多线程的一点笔记
- 关于RBM的一点笔记
- 关于TypeScript的一点笔记
- 关于dll写code的一点疑问 答案
- 关于QT加载lib与dll的一点评论
- 关于iOS的UIView的一点笔记
- DOS、批处理命令一览
- javascript之Dom编程艺术六
- 是否可以从一个static方法内部调用一个非static方法?
- 【原创】一个dex脱壳脚本
- Kylin, Mondrian, Saiku系统的整合
- 关于DLL的一点笔记
- Android平台架构
- 自定义Label的高度
- HibernateUtil—常用sql和hql的封装
- win10安装docker
- jsp中静态包含和动态包含的区别
- 《北风那个吹》观后
- 日常英文缩写以及杂记
- Android Studio调试功能使用总结