DLL(动态链接库)是程序模块,它包括代码、数据或资源,能够被其他的Windows 应用程序共享。DLL的主要特点之一是应用程序可以在运行时调入代码执行,而不是在编译时链接代码,因此,多个应用程序可以共享同一个DLL的代码。

  事实上,文件 Kernel32.dll、User32.dll、GDI32.dll就是核心Win32 系统的动态链接库。Kernel.dll 负责内存、进程、线程的管理。User32.dll包含了一些程序,是创建窗口和处理Win32消息的用户接口。GDI32.dll负责处理图形。你还会听说其他的系统 D L L,譬如 AdvAPI32.dll 和ComDlg32.dll,它们分别处理对象安全性/注册操作和通用对话框

  使用动态链接库的另一个特点是有利于应用程序的模块化。这样就简化了应用程序的修改,因为一般只需要修改DLL,而不是整个应用程序。Windows 环境自身就是模块化类型的典型实例。每当安装一个新设备,就安装一个设备驱动程序(即DLL),是设备能够与Windows互相通信

  在磁盘上,一个DLL 基本上类似于一个 Windows可执行文件(*。exe)。一个主要的区别是,DLL不是一个独立的可执行文件,尽管它可能包含了可执行代码。大部分DLL文件的扩展名是.dll,也有可能是.drv(设备驱动程序)、.sys(系统文件)、.fon(字体文件),这些不包含可执行代码

  注意:Delphi引入了一种叫做程序包的特殊用途的DLL,它应用于Delphi和 C++编程环境

  DLL通过动态链接技术(dynamic linking)与其他应用程序共享代码。总之,当一个应用程序使用一个DLL,Win32 系统会确保内存中只有一个该DLL 的拷贝,这是通过内存映射文件来实现的。DLL首先被调入Win32 的全局堆,然后映射到调用这个DLL进程的地址空间。在Win 32 系统中,每个进程都被分配有自己的32 位线性地址空间。当一个DLL被多个进程调用时,每个进程都会获得该DLL的一份影响。因此,在 16位Windows中,程序代码、数据、资源不被进程共享,而在 Win32 中,DLL是可以被看做是属于调用该DLL进程自己的代码。

  但是这并不意味着,如果多进程调用一个DLL,物理内存就分配有该 DLL的每个实例。通过从系统的全局堆到调用该DLL 的每一进程的地址空间的映射,DLL映像置于每个进程的地址空间。至少在理想情况下应这样。

  

设置DLL的首选基地址

  如果DLL被调入进程的地址空间时设置了基地址,这样DLL数据就可以被共享。如果DLL的基地址与已经分配的DLL地址重叠的话,Win32 重新分配基地址。这样,每一个重新分配的DLL 实例都有自己的物理上的内存空间和交换文件空间

  这是很关键的,通过使用$IMAGEBASE 指示符,给每个DLL 都设置一个基地址,这样不会引起冲突或不会出现地址重叠

  如果有多个应用程序调用同一个DLL,设置一个唯一的基地址,这样无论是在进程的地段地址或者是在一般的DLL(如VCL包)的高端地址,都不会引起冲突。一般可执行文件(EXE和DLL)缺省的基地址为 $400000,这就意味着,除非修改DLL 的基地址,否则就会与主程序的基地址引起冲突,因此进程间也就不能共享DLL的数据

  在调用时,DLL不需要重新分配或安装,因此它保存在本地磁盘上,DLL的内存页面被直接映射到磁盘上的DLL文件。DLL代码不需要占用系统页面文件(也叫交换文件)的空间。这就是为什么系统提交页的总数和大小可能比系统交换文件加内存要大

有关DLL的一些术语如下

• 应用程序,一个扩展名为.exe 的Windows程序。

• 可执行文件,一个包含可执行代码的文件,它包括 .dll文件和.exe文件。

• 实例,当提到应用程序和DLL时,在内存中出现的可执行文件就是实例。Win 32 系统通过实例句柄的方式来引用实例。例如,如果一个应用程序运行两次,就会有应用程序的两个实例,同时就有两个实例句柄。当一个DLL被调入时,实例及其相应的实例句柄同时出现。应该注意的是,这里所提的实例与类的实例不能混淆。

• 模块,在32位Windows系统中,模块和实例可以说是同义的。而在 16位的Windows系统中,是建立一个模块数据库来管理模块的,一个模块对应一个模块句柄。在 Win 32中,应用程序的每一个实例都拥有自己的地址空间;所以,没有必要为模块单独指定标识符。不过,微软仍然保留了它自己的术语。注意一点,模块和实例是同一个概念。

• 任务,Windows是一个多任务(或任务切换)环境,所以它必须能够为运行的多个实例合理分配系
统资源和时间。于是,Windows建立一个任务数据库,这个数据库包括任务的实例句柄和其他必
要信息,以此实现任务切换功能。任务是 Windows用来管理和分配资源与时间段的重要元素。

Delphi之DLL知识学习1---什么是DLL的更多相关文章

  1. Delphi之DLL知识学习4---创建DLL

    下面是在Delphi中创建一个DLL的全过程,你将看到怎样创建一个接口单元,使之可以被其他的应用程序访问.并且将学会怎么把Delphi的窗体加入DLL中. 一.数美分:一个简单的DLL 下面是包含一个 ...

  2. Delphi之DLL知识学习3---为什么要使用DLL

    使用DLL有若干理由,其中有一些前面提到过的.大体说来,使用动态链接库可以共享代码.系统资源,可以隐藏实现的代码或底层的系统例程.设计自定义控件 一.共享代码.资源和数据 前面已经提到,共享代码是创建 ...

  3. Delphi之DLL知识学习2---静态链接和动态链接

    静态连接 静态链接是指Delphi 编译器把要调用的函数和过程编译成可执行代码.函数的代码可存留在应用程序的 .dpr文件或一单元中.当链接用户的应用程序时,这些函数与过程便成为最终的可执行文件的一部 ...

  4. Delphi之DLL知识学习5---在Delphi应用程序中使用DLL

    首先说明一下:同一个动态库(DLL)被多个的程序加载的话,那么将会在每次加载的时候都会重新分配新的独立的内存空间,绝对不是共用一个,所以当一个DLL被多次加载的时候,其会在内存中“复制”多份,不会互相 ...

  5. Delphi基础语法的学习笔记和注意事项总结

    以下是我在自学Delphi的时候,对一些注意点的简单总结,并没有什么系统性可言,只是一个学习时顺手记下的笔记,主要为了当时加深对知识的印象,并没有希望能在以后的复习和使用Delphi中有什么多大的参考 ...

  6. 网络知识学习2---(IP地址、子网掩码)(学习还不深入,待完善)

    紧接着:网络知识学习1 1.IP地址    IP包头的结构如图 A.B.C网络类别的IP地址范围(图表) A.B.C不同的分配网络数和主机的方式(A是前8个IP地址代表网络,后24个代表主机:B是16 ...

  7. 【Delphi内联汇编学习1】Delphi与汇编

    我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...

  8. 关于DLL的学习

    1.前言: 人总归还是要有梦想的,不然跟咸鱼有什么区别.这一周给自己定下了研究DLL的任务还是要逼自己完成的呀,上了一天的党校,游戏也不打在这里写博,心疼自己.话说为什么要给自己下这样一个任务呢,是因 ...

  9. HTML5标签汇总及知识学习线路总结

    HTML5标签汇总,以及知识学习线路总结.

随机推荐

  1. Linux搭建一个FTP服务器

    1.安装vsftp 2.配置vsftpd.conf, vim /etc/vsftpd.conf 下面说说里面比较重要的选项 1 anonymous_enable=NO #不允许匿名用户 2 3 loc ...

  2. hiho #1361 Playfair密码表

    题目1 : Playfair密码表 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho经常用Playfair密码表加密自己的代码. 密码表是按以下步骤生成的. ...

  3. 一个IP多个https站点配置

    在一台主机上放置一个https网站,究竟该怎么配置?对于IIS和Apache以及Nginx等不同的服务器,方法是不同的,网上有很多教程,在此就不再赘述了. 至于一台主机,如何配置多个https网站呢? ...

  4. Exception异常

    JAVA异常指的是运行期出现的错误. 观察错误的名字和行号最重要. 运用关键字try将可能出错的语句catch出来并添加友好的话 \ 在这句话中的ae代表一个自己命名的对象. 1.要捕获首先需要知道错 ...

  5. Objective C 内存管理[转]

    1  配对原则 alloc – release new – release retain - release copy – release 2  new和alloc-init的区别 (1)区别只在于a ...

  6. 【架构】How To Use HAProxy to Set Up MySQL Load Balancing

    How To Use HAProxy to Set Up MySQL Load Balancing Dec  2, 2013 MySQL, Scaling, Server Optimization U ...

  7. JavaScript——正则表达式

    1.显式创建正则表达式:var searchPattern=new RegExp(‘+s’);加号会匹配字符串中任何一个带有一个或者多个连续的s. 2.RegExp对象的方法:test和exec te ...

  8. ACM/ICPC 之 数据结构-邻接表+BFS(TSH OJ-无线广播Broadcast)

    这道题中若能够构成互不干扰的区域,其构成的图其实就是汉密尔顿路(Hamilton road),因此如果能够观察出来可以直接转化为汉密尔顿路的存在性证明,即便不能观察,我相信ACMer也能转化为BFS问 ...

  9. Application.AddMessageFilter(this);

    开发环境:windows 8(x64), vs2013 只要“项目属性-调试”中选中“启用Visual Studio承载进程“,在VS2013中用F5调试,调用Application.AddMessa ...

  10. WP开发资源

    wp开发:连续两次点击返回键退出程序的设计: http://hi.baidu.com/youngytj/item/6be317719cc371306cc37ce4 X http://www.cnblo ...