第1 9章 D L L基础

这章是介绍基本dll,我就记录一些简单应用,dll的坑点以及扩展后面两章会说,到时候在总结。

自从M i c r o s o f t公司推出第一个版本的Wi n d o w s操作系统以来,动态链接库(D L L)一直是这个操作系统的基础。 Windows API中的所有函数都包含在 D L L中。3个最重要的 D L L是K e r n e l 3 2 . d l l,它包含用于管理内存、进程和线程的各个函数; U s e r 3 2 . d l l,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数; G D I 3 2 . d l l,它包含用于画图和显示文本的各个函数。

本章将要介绍如何为应用程序创建D L L。下面是为什么要使用D L L的一些原因:

• 它们扩展了应用程序的特性。

• 它们可以用许多种编程语言来编写。

• 它们简化了软件项目的管理。

• 它们有助于节省内存。

• 它们有助于资源的共享。

• 它们有助于应用程序的本地化。

• 它们有助于解决平台差异。

• 它们可以用于一些特殊的目的。

19.1 DLL与进程的地址空间

在应用程序(或另一个D L L)能够调用D L L中的函数之前,D L L文件映像必须被映射到调用进程的地址空间中。若要进行这项操作,可以使用两种方法中的一种,即加载时的隐含链接或运行期的显式链接。隐含链接将在本章的后面部分介绍,显式链接将在第 2 0章中介绍。

一旦D L L的文件映像被映射到调用进程的地址空间中, D L L的函数就可以供进程中运行的所有线程使用。实际上, D L L几乎将失去它作为 D L L的全部特征。对于进程中的线程来说,D L L的代码和数据看上去就像恰巧是在进程的地址空间中的额外代码和数据一样。当一个线程调用D L L函数时,该D L L函数要查看线程的堆栈,以便检索它传递的参数,并将线程的堆栈用于它需要的任何局部变量。此外,D L L中函数的代码创建的任何对象均由调用线程所拥有,而D L L本身从来不拥有任何东西。

可执行文件的全局变量和静态变量不能被同一个可执行文件的多个运行实例共享。Windows 98能够确保这一点,方法是在可执行文件被映射到进程的地址空间时为可执行文件的全局变量和静态变量分配相应的存储器。Windows 2000确保这一点的方法是使用第1 3章介绍的写入时拷贝(c o p y - o n - w r i t e)机制。D L L中的全局变量和静态变量的处理方法是完全相同的。当一个进程将D L L的映像文件映射到它的地址空间中去时,系统将同时创建全局数据变量和静态数据变量的实例。

注意:

许多开发人员经常会犯一个常见的错误,因为他们忘记了若干个C / C + +运行期库可以存在于单个地址空间中。请看下面的代码:

D L L函数分配的内存块是由E X E的函数释放的吗?答案是可能的。上面显示的代码并没有为你提供足够的信息。如果E X E和D L L都链接到D L L的C / C + +运行期库,那么上面的代码将能够很好地运行。但是,如果两个模块中的一个或者两个都链接到静态C / C + +运行期库,那么对free函数的调用就会失败。

正确的姿势:

后面是一些基本的DLL开发和调用细节,就不说了,还有就是建议不要通过函数编号来调用函数,这个不太靠谱,可能会发生变动,但是如果是对速度要求极高的程序,可以考虑编号调用(前提是调用自己开发的DLL,这样就不会有变动了)。其他细节下一章说。

Windows核心编程 第十九章 DLL基础的更多相关文章

  1. 【windows核心编程】 第六章 线程基础

    Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ①    一个是线程的内核 ...

  2. Windows核心编程:第6章 线程基础

    Github https://github.com/gongluck/Windows-Core-Program.git //第6章 线程基础.cpp: 定义应用程序的入口点. // #include ...

  3. Windows核心编程 第十五章 在应用程序中使用虚拟内存

    第1 5章 在应用程序中使用虚拟内存 Wi n d o w s提供了3种进行内存管理的方法,它们是: • 虚拟内存,最适合用来管理大型对象或结构数组. • 内存映射文件,最适合用来管理大型数据流(通常 ...

  4. Windows核心编程 第十四章 虚拟内存

    第1 4章 虚 拟 内 存 <这一章没啥,是说的几个内存相关的函数 > 14.1 系统信息 许多操作系统的值是根据主机而定的,比如页面的大小,分配粒度的大小等.这些值决不应该用硬编码的形式 ...

  5. Windows核心编程 第十二章 纤程

    第1 2章 纤 程 M i c r o s o f t公司给Wi n d o w s添加了一种纤程,以便能够非常容易地将现有的 U N I X服务器应用程序移植到Wi n d o w s中.U N I ...

  6. Windows核心编程:第4章 进程

    Github https://github.com/gongluck/Windows-Core-Program.git //第4章 进程.cpp: 定义应用程序的入口点. // #include &q ...

  7. 《windows核心编程系列》十七谈谈dll

    DLL全称dynamic linking library.即动态链接库.广泛应用与windows及其他系统中.因此对dll的深刻了解,对计算机软件开发专业人员来说非常重要. windows中所有API ...

  8. Windows核心编程:第14章 探索虚拟内存

    Github https://github.com/gongluck/Windows-Core-Program.git //第14章 探索虚拟内存.cpp: 定义应用程序的入口点. // #inclu ...

  9. Windows核心编程 第十八章 堆栈

    第1 8章 堆 栈 对内存进行操作的第三个机制是使用堆栈.堆栈可以用来分配许多较小的数据块.例如,若要对链接表和链接树进行管理,最好的方法是使用堆栈,而不是第 1 5章介绍的虚拟内存操作方法或第1 7 ...

随机推荐

  1. Kafka SASL ACL配置踩坑总结

    源起:工程现阶段中间件采用的是kafka.满足了大数据的高吞吐,项目间的解耦合,也增强了工程的容错率与扩展性.但是在安全这一块还有漏洞,kafka集群中,只要网站内的任何人知道kafka集群的ip与t ...

  2. ORM思想解析

    ORM思想解析 qq_16055765 2019-01-10 11:29:08 1688 收藏 1 分类专栏: # hibernate 最后发布:2019-01-10 11:29:08首次发布:201 ...

  3. 自己动手实现springboot运行时新增/更新外部接口

    最近有个需求:需要让现有springboot项目可以加载外部的jar包实现新增.更新接口逻辑.本着拿来主义的思维网上找了半天没有找到类似的东西,唯一有点相似的还是spring-loaded但是这个东西 ...

  4. CVE-2014-4210 SSRF漏洞

    Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis.fastcgi等脆弱组件. 修复方式: 1.删除server/lib/uddiexplorer.w ...

  5. 在linux下如何搭建jmeter的环境

    首先 我们可以选择不同版本的jmeter 转载原连接:https://blog.csdn.net/lyl0724/article/details/79474388 Jmeter历史版本下载地址 htt ...

  6. Serverless Wordpress 系列建站教程(三)

    从前面两篇教程文章里,我们可以了解到 Serverless WordPress 的低门槛部署,免运维等功能优势.而建站场景中,开发者关注的另一个重点则是成本问题,Serverless 架构究竟如何计费 ...

  7. Python基础【while循环】

    Python基础[while循环] 1.while循环: 格式 while 条件: ...... print(......) 注意,在while语句也可以嵌套else,但是else不执行循环,执行后直 ...

  8. linux下 > /dev/null 2 > &1 的意思和如何在后台启动进程

    一.几个基本符号及其含义 之前看到别人写的一个shell脚本,有一个命令是:rm -f ${src_tmp_file} > /dev/null 2>&1 现在大概明白是什么意思了 ...

  9. DNA序列(JAVA语言)

    package 第三章习题; /*  * 输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小.  * 两个等长字符串的Hamming距离等于字符不同的位置个数, ...

  10. 利用浏览器favicon的缓存机制(F-Cache)生成客户端浏览器唯一指纹

    利用浏览器favicon的缓存机制(F-Cache)生成客户端浏览器唯一指纹 首先介绍下: 这个技术出自 UIC论文:https://www.cs.uic.edu/~polakis/papers/so ...