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核心编程学习手札之十九相关推荐

  1. 堆栈——Windows核心编程学习手札之十八

    堆栈 --Windows核心编程学习手札之十八 堆栈可以用来分配许多较小的数据块,可以不考虑分配粒度和页面边界之类的问题,但分配和释放内存块的速度比其他机制要慢,并且无法直接控制物理存储器的提交和回收 ...

  2. 线程的堆栈——Windows核心编程学习手札之十六

    线程的堆栈 --Windows核心编程学习手札之十六 系统会在进程的地址空间内保存一些区域,同时也会在进程地址空间内为线程的堆栈保留区域.线程都有自己的堆栈,创建时,系统就保留一个堆栈空间区域,并将相 ...

  3. 在应用程序中使用虚拟内存——Windows核心编程学习手札之十五

    在应用程序中使用虚拟内存 --Windows核心编程学习手札之十五 Windows提供了3种进行内存管理的方法: 1)  虚拟内存,最适合用来管理大量对象或结构数组: 2)  内存映射文件,最适合用来 ...

  4. 虚拟内存——Windows核心编程学习手札之十四

    虚拟内存 --Windows核心编程学习手札之十四 系统信息 有些操作系统的值是根据主机而定的,如页面大小.分配粒度大小等,这些值不用硬编码形式,进程初始化时应检索这些值以使用.函数GetSystem ...

  5. 线程基础知识——Windows核心编程学习手札系列之六

    线程基础知识 --Windows核心编程学习手札系列之六 线程与进程一样由两部分构成:一是线程的内核对象,操作系统用它来对线程实施管理,也是系统用来存放线程统计信息的地方:二是线程堆栈,用于维护线程在 ...

  6. 插入DLL和挂接API——Windows核心编程学习手札之二十二

    插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...

  7. DLL的高级操作技术——Windows核心编程学习手札之二十

    DLL的高级操作技术 --Windows核心编程学习手札之二十 显示加载DLL模块: HINSTANCE LoadLibrary(PCTSTR pszDLLPathName); HINSTANCE L ...

  8. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  9. 线程本地存储器——Windows核心编程学习手札之二十一

    线程本地存储器 --Windows核心编程学习手札之二十一 C/C++运行期库使用线程本地存储器,运行期库是在多线程应用程序出现前设计的,因此运行期库里的大多数函数是用于单线程应用程序的.函数strt ...

最新文章

  1. Git如何将本地分支推送到远程库中
  2. 谷歌市场上架aab安装包的各种坑
  3. java原子整数_多线程(四、原子类-AtomicInteger)
  4. bkg bnc_BNC的完整形式是什么?
  5. 算法篇【枚举2 -- 生理周期】
  6. 不会点SQLite,都不好意思说自己是开发的
  7. html文档支持代码高亮,为HTML中的代码添加语法高亮
  8. 我妈劝我找份稳定的工作
  9. 导数与微分的知识点思维导图_高中历史各大板块知识点与思维导图汇总(必修二)...
  10. pinpoint 磁盘不足的坑
  11. 抓包工具之fiddler
  12. 在线json解析工具 在线js解析加密混合工具
  13. Red5流媒体服务器初探——Red5服务器的搭建
  14. 天正2014打开加载lisp_win10系统设置CAD2014打开自动加载天正的恢复方法
  15. 图片格式tif转换jpg
  16. 水调歌头.明月几时有 小儿拼音版
  17. 500~1000元价位有哪些新手入门吉他推荐?saga萨伽、VEAZEN费森和雅马哈这几个品牌怎么样?
  18. python之客户流失预警
  19. 金融量化数据接口API汇总
  20. 如何选择计算机软考科目,计算机软考科目众多 我们该如何选择考试科目?

热门文章

  1. 2020.2idea怎么创建html模块_利用idea快速搭建一个项目
  2. html元素和属性,HTML常用元素和属性(一)
  3. php中禁用下拉框,php – Tinymce,禁用numlist下拉列表
  4. IIS FTP部分文件上传报错451的原因及解决方法
  5. 服务器死机是怎么造成的?
  6. 虚拟机增强工具的安装
  7. 按字符串长度切割字符串(支持汉字占2个长度)
  8. js下载文件及命名(兼容多浏览器)
  9. 数组与字符串三(Cocos2d-x 3.x _Array容器)
  10. 抽象数据类型Triplet的C语言实现