Delphi之DLL知识学习2---静态链接和动态链接
静态连接
静态链接是指Delphi 编译器把要调用的函数和过程编译成可执行代码。函数的代码可存留在应用程序的 .dpr文件或一单元中。当链接用户的应用程序时,这些函数与过程便成为最终的可执行文件的一部分。也就是说,函数和过程都在程序的.exe文件中
程序运行时,函数和过程随程序一起调入内存,它们的位置与程序的位置是相关的。当主程序需要调用程序或过程时,流程将跳转到函数或过程所在的位置,执行完函数或过程的代码,将返回主程序调用位置。而函数和过程的相对位置,在链接时就已经确定了
以上是对Delphi 编译器进行静态链接这一复杂过程的简单描述。
注意:Delphi实现一个智能链接器,可以自动地把项目中没有引入的函数、过程和有类型的常量去掉,那么,最后的可执行文件就不会有冗余的代码
动态链接
结合:http://www.cnblogs.com/xumenger/p/4372289.html
假设有两个应用程序,都要调用一个单元的同一个函数,当然,这两个应用程序都要在其 uses 子句中包含该单元。如果这两个程序要同时运行,那么内存中就存在两份该函数,如果还有第三个这样的应用程序,内存中就会有第三份该函数的实例,这样,就会三次占据内存。这个小例子就表明了动态链接的优越性之一。函数通过动态链接,被放到一个DLL中。那么如果一个应用程序把该函数调入内存,其他应用程序就可以通过映射DLL的映像到自己的进程内存空间来共享代码。理论上讲,最终结果是内存中只存在该DLL的一份实例
对于动态链接,在程序运行时,通过引入一个外部函数(该函数包含在DLL中)而将该函数链接到可执行文件中。其中的引用可以在应用程序中声明,但是通常情况下是放在一个专门的引入(import)单元中,在这个单元中可以声明引入的函数、过程以及DLL所需的多种类型的定义
例如,假设有一个交MaxLid.dll的动态链接库,其中包含一个函数
function Max(i1, i2: Integer): Integer;
这个函数返回两个整数中较大的一个数,一个典型的引入单元如下:
unit MaxInt;
interface
function Max(i1, i2: Integer): Integer; implementation
function Max; external 'MAXLIB';
end;
你也许注意到了,这看上去类似于一般的单元,但是这个单元没有定义Max()函数。关键字 external后面的字符串就是该 DLL的名称。要使用这个单元,应用只需要把MaxUnit加到它的 uses子句中即可。当这个程序运行时,该DLL就会自动地被调入内存,并且任何需要调用Max() 的程序都被链接到这个DLL中的 Max() 函数
调用DLL有两种方式,这是其中一种,叫做隐式调用,就是让Windows 在应用程序调入时自动地调入所要调用的 DLL
另一种是显式调用
Delphi之DLL知识学习2---静态链接和动态链接的更多相关文章
- Delphi之DLL知识学习4---创建DLL
下面是在Delphi中创建一个DLL的全过程,你将看到怎样创建一个接口单元,使之可以被其他的应用程序访问.并且将学会怎么把Delphi的窗体加入DLL中. 一.数美分:一个简单的DLL 下面是包含一个 ...
- Delphi之DLL知识学习1---什么是DLL
DLL(动态链接库)是程序模块,它包括代码.数据或资源,能够被其他的Windows 应用程序共享.DLL的主要特点之一是应用程序可以在运行时调入代码执行,而不是在编译时链接代码,因此,多个应用程序可以 ...
- Delphi之DLL知识学习3---为什么要使用DLL
使用DLL有若干理由,其中有一些前面提到过的.大体说来,使用动态链接库可以共享代码.系统资源,可以隐藏实现的代码或底层的系统例程.设计自定义控件 一.共享代码.资源和数据 前面已经提到,共享代码是创建 ...
- Delphi之DLL知识学习5---在Delphi应用程序中使用DLL
首先说明一下:同一个动态库(DLL)被多个的程序加载的话,那么将会在每次加载的时候都会重新分配新的独立的内存空间,绝对不是共用一个,所以当一个DLL被多次加载的时候,其会在内存中“复制”多份,不会互相 ...
- 静态链接 VS 动态链接
什么是链接? 链接其实就是连接的意思,将所有相关的东西连接起来. 简单理解静态连接和动态链接: 静态链接:编译时完成链接 动态链接:程序运行起来后,根据需求再去链接,这就是动态链接 静态链接 什么是静 ...
- linux学习 建立静态库,动态库,写简单的makefile
建立静态库 建立四个文件 bin(可运行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件里运行 1)gcc -c add.c //编译add.c ...
- [置顶] linux学习之静态库和动态库的制作与使用
linux中静态库和动态库的制作与使用 一.静态链接库 1.首先编写模块程序example.c.example.h 2.使用gcc -c example.c -o example.o编译example ...
- JAVA学习篇--静态代理VS动态代理
本篇博客的由来,之前我们学习大话设计,就了解了代理模式,但为什么还要说呢? 原因: 1,通过DRP这个项目,了解到了动态代理,认识到我们之前一直使用的都是静态代理,那么动态代理又有什么好处呢?它们二者 ...
- Java设计模式学习06——静态代理与动态代理(转)
原地址:http://blog.csdn.net/xu__cg/article/details/52970885 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的 ...
随机推荐
- Genymotion加速下载虚拟镜像速度慢失败Connection timeout
Genymotion也算是个android的模拟程序了, Add new device后下载速度太慢了,容易失败 解决方法有二: 1.设置HTTP代理,在Setting->Network,自己设 ...
- windows添加linux 启动引导项
需要软件: EasyBCD 下载地址: http://pan.baidu.com/s/1c20v1GO 在windows 下安装上述软件. 然后打开,语言的话现在中文即可. 可以看到如下画面: 1.选 ...
- JQuery textarea中val(),text()
val()是当前输入框的前台显示内容 text()是原始内容, 调试时浏览器审查元素可以发现如果只改变val(),text()值是不会改变的
- MySql 导出excel
select * into outfile './bestlovesky.xls' from bestlovesky where 1 order by id desc limit 0, 50;
- bootstrap框架----像素
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Python 列表元素排重uniq
# -*- coding: gbk -*- def uniq(ls): lsCopy=[e for e in ls] for i in xrange(1,len(ls)): for j in xran ...
- 【自动部署】Ansible 怎么通过堡垒机/跳板机 访问目标机器
Ansible机器的 /root/.ssh/config 配置如下即可:Host 目标机器IP User root IdentityFile=/root/.ssh/xxx_id_rsa ProxyCo ...
- C# 毕业证书打印《二》
当证书的打印功能得以实现,最关键的功能便是数据. 通过对打印的了解,打印中最关键的功能便是打印事件中的方法. private void pd_PrintPage(object sender, Prin ...
- HTML——选择器
在前面的章节中,我们展示了一些有关如何选取 HTML 元素的实例. 关键点是学习 jQuery 选择器是如何准确地选取您希望应用效果的元素. jQuery 元素选择器和属性选择器允许您通过标签名.属性 ...
- ACM/ICPC 之 DP-浅谈“排列计数” (POJ1037)
这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列 ...