DLL基础——Windows核心编程学习手札之十九
DLL基础
——Windows核心编程学习手札之十九
Windows API中的所有函数都包含在DLL中,3个最重要的DLL是Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll包含用于画图和显示文本的各个函数。Windows还配有若干别的DLL,用于执行一些特殊任务,如AdvAPI32.dll包含用于实现对象安全性、注册表操作和事件记录的函数;ComDlg32.dll包含常用对话框(如File Open和File 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映射到进行的地址空间。
DLL基础——Windows核心编程学习手札之十九相关推荐
- 堆栈——Windows核心编程学习手札之十八
堆栈 --Windows核心编程学习手札之十八 堆栈可以用来分配许多较小的数据块,可以不考虑分配粒度和页面边界之类的问题,但分配和释放内存块的速度比其他机制要慢,并且无法直接控制物理存储器的提交和回收 ...
- 线程的堆栈——Windows核心编程学习手札之十六
线程的堆栈 --Windows核心编程学习手札之十六 系统会在进程的地址空间内保存一些区域,同时也会在进程地址空间内为线程的堆栈保留区域.线程都有自己的堆栈,创建时,系统就保留一个堆栈空间区域,并将相 ...
- 在应用程序中使用虚拟内存——Windows核心编程学习手札之十五
在应用程序中使用虚拟内存 --Windows核心编程学习手札之十五 Windows提供了3种进行内存管理的方法: 1) 虚拟内存,最适合用来管理大量对象或结构数组: 2) 内存映射文件,最适合用来 ...
- 虚拟内存——Windows核心编程学习手札之十四
虚拟内存 --Windows核心编程学习手札之十四 系统信息 有些操作系统的值是根据主机而定的,如页面大小.分配粒度大小等,这些值不用硬编码形式,进程初始化时应检索这些值以使用.函数GetSystem ...
- 线程基础知识——Windows核心编程学习手札系列之六
线程基础知识 --Windows核心编程学习手札系列之六 线程与进程一样由两部分构成:一是线程的内核对象,操作系统用它来对线程实施管理,也是系统用来存放线程统计信息的地方:二是线程堆栈,用于维护线程在 ...
- 插入DLL和挂接API——Windows核心编程学习手札之二十二
插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...
- DLL的高级操作技术——Windows核心编程学习手札之二十
DLL的高级操作技术 --Windows核心编程学习手札之二十 显示加载DLL模块: HINSTANCE LoadLibrary(PCTSTR pszDLLPathName); HINSTANCE L ...
- 未处理异常和C++异常——Windows核心编程学习手札之二十五
未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...
- 线程本地存储器——Windows核心编程学习手札之二十一
线程本地存储器 --Windows核心编程学习手札之二十一 C/C++运行期库使用线程本地存储器,运行期库是在多线程应用程序出现前设计的,因此运行期库里的大多数函数是用于单线程应用程序的.函数strt ...
最新文章
- Git如何将本地分支推送到远程库中
- 谷歌市场上架aab安装包的各种坑
- java原子整数_多线程(四、原子类-AtomicInteger)
- bkg bnc_BNC的完整形式是什么?
- 算法篇【枚举2 -- 生理周期】
- 不会点SQLite,都不好意思说自己是开发的
- html文档支持代码高亮,为HTML中的代码添加语法高亮
- 我妈劝我找份稳定的工作
- 导数与微分的知识点思维导图_高中历史各大板块知识点与思维导图汇总(必修二)...
- pinpoint 磁盘不足的坑
- 抓包工具之fiddler
- 在线json解析工具 在线js解析加密混合工具
- Red5流媒体服务器初探——Red5服务器的搭建
- 天正2014打开加载lisp_win10系统设置CAD2014打开自动加载天正的恢复方法
- 图片格式tif转换jpg
- 水调歌头.明月几时有 小儿拼音版
- 500~1000元价位有哪些新手入门吉他推荐?saga萨伽、VEAZEN费森和雅马哈这几个品牌怎么样?
- python之客户流失预警
- 金融量化数据接口API汇总
- 如何选择计算机软考科目,计算机软考科目众多 我们该如何选择考试科目?