Delphi之DLL知识学习1---什么是DLL
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的更多相关文章
- Delphi之DLL知识学习4---创建DLL
下面是在Delphi中创建一个DLL的全过程,你将看到怎样创建一个接口单元,使之可以被其他的应用程序访问.并且将学会怎么把Delphi的窗体加入DLL中. 一.数美分:一个简单的DLL 下面是包含一个 ...
- Delphi之DLL知识学习3---为什么要使用DLL
使用DLL有若干理由,其中有一些前面提到过的.大体说来,使用动态链接库可以共享代码.系统资源,可以隐藏实现的代码或底层的系统例程.设计自定义控件 一.共享代码.资源和数据 前面已经提到,共享代码是创建 ...
- Delphi之DLL知识学习2---静态链接和动态链接
静态连接 静态链接是指Delphi 编译器把要调用的函数和过程编译成可执行代码.函数的代码可存留在应用程序的 .dpr文件或一单元中.当链接用户的应用程序时,这些函数与过程便成为最终的可执行文件的一部 ...
- Delphi之DLL知识学习5---在Delphi应用程序中使用DLL
首先说明一下:同一个动态库(DLL)被多个的程序加载的话,那么将会在每次加载的时候都会重新分配新的独立的内存空间,绝对不是共用一个,所以当一个DLL被多次加载的时候,其会在内存中“复制”多份,不会互相 ...
- Delphi基础语法的学习笔记和注意事项总结
以下是我在自学Delphi的时候,对一些注意点的简单总结,并没有什么系统性可言,只是一个学习时顺手记下的笔记,主要为了当时加深对知识的印象,并没有希望能在以后的复习和使用Delphi中有什么多大的参考 ...
- 网络知识学习2---(IP地址、子网掩码)(学习还不深入,待完善)
紧接着:网络知识学习1 1.IP地址 IP包头的结构如图 A.B.C网络类别的IP地址范围(图表) A.B.C不同的分配网络数和主机的方式(A是前8个IP地址代表网络,后24个代表主机:B是16 ...
- 【Delphi内联汇编学习1】Delphi与汇编
我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...
- 关于DLL的学习
1.前言: 人总归还是要有梦想的,不然跟咸鱼有什么区别.这一周给自己定下了研究DLL的任务还是要逼自己完成的呀,上了一天的党校,游戏也不打在这里写博,心疼自己.话说为什么要给自己下这样一个任务呢,是因 ...
- HTML5标签汇总及知识学习线路总结
HTML5标签汇总,以及知识学习线路总结.
随机推荐
- Linux 之 shell 比较运算符
运算符 描述 示例 文件比较运算符 -e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ] -d filename 如果 filename 为目录, ...
- bug-android之INSTALL_FAILED_NO_MATCHING_ABIS
bug描述: 经常在网络上下载一些实例,自己研究 ,运行时不时会出现这个bug: Installation error: INSTALL_FAILED_NO_MATCHING_ABIS bug解决方案 ...
- jtable插件api
官网2016-03-15 事例图: 一.客户端配置 1. paging boolean default:false 配置是否分页,果断改为true. 2. pageList string defaul ...
- url中出现井号("#")的问题
今天在asp.net mvc网站项目的前台页面里写一段js代码时,想要跳转到某个url,例如 location.href="xxxx?"+"id="+id+&q ...
- php中的钩子(hook插件机制)
对"钩子"这个概念其实不熟悉,最近看到一个php框架中用到这种机制来扩展项目,所以大概来了解下. hook插件机制的基本思想: 在项目代码中,你认为要扩展(暂时不扩展)的地方放置一 ...
- 【微服务】SpringBoot、SpringCloud相关
深入学习微框架:Spring Boot: http://www.infoq.com/cn/articles/microframeworks1-spring-boot/ Spring Boot--2 ...
- POCO浅探
POCO作用类似于POJO.POJO的内在含义是指那些从来没有任何类继承.也没有实现任何接口,更是没有被其他框架侵入的JAVA对象.POCO的含义与此是一致的.POJO的意义就在于它的简单灵活性,能够 ...
- pip安装简单方法
前提:有网络 wget -c --no-check-certificate https://bootstrap.pypa.io/get-pip.py python get-pip.py
- 堆栈指针 ---delete 使用
对拥有堆中一个有效对象的地址的指针进行删除操作的结果,是将这个堆内存的状态从“使用中” 变为“可用”(此时的可用就是指可以调用内存)释放了,可以再次覆盖此处;; 对指针内存进行删除操作后,指针 ...
- Linux下常用的硬件信息查看命令
1.查看CPU型号,这里为了方便查看结合管道符用grep进行了匹配,当然只需要前面的命令也可以,命令如下: cat /proc/cpuinfo | grep "model name" ...