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 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的 ...
随机推荐
- explicit,violate,volatile,mutable小结
转自:http://blog.csdn.net/helonsy/article/details/7091130 explicit:放在构造函数前面可以阻止构造函数的隐式类型转换.这样可以避免不必要的错 ...
- JavaScript之函数
控制语句(switch) switch(name){ case '1': age = 123; break; case '2': age = 456; break; case '3': age = 7 ...
- super用法和继承中的构造方法
当new出来一个对象的时候, this是只想对象本身. 在存在继承关系时, 在子类中用super表示引用父类中的东西. 子类的构造过程必须调用父类的构造方法. 子类中包含父类,所以子类中一定要先调用 ...
- MyEclipse 15 集成SVN
一.在线更新 地址:http://subclipse.tigris.org/update_1.8.x 二.手动安装
- phpcms图片模型调用组图的问题
phpcms里面有个图片模型,之前一直没有用过,之前用的轮播图是用文章+缩略图+推荐位实现的 今天看了一下图片模型添加内容的地方,和平常的文章相比多了一个组图的地方:
- mysql允许其他电脑访问权限开通
首先进入mysql: mysql -u root 如果有密码会提示输入密码 然后输入如下授权代码, 如下即授权用户root使用密码admin123从任何主机连接到mysql服务器 GRANT ALL ...
- c#的问号?和双问号??
1.问号?表示该变量可以为空 int? a=new int?(); Console.Writeline(a);//a是null 等价于: int? a=null; 也等价于下面这行,表示该变量默认为n ...
- Android SDK在线更新镜像服务器
http://www.cnblogs.com/tc310/p/4696731.html#_label0
- SHAREPOINT - CAML列表查询
首先要了解的是CAML(Collaboration Application Markup Language)不仅仅是用在对列表.文档库的查询,字段的定义,站点定义等处处使用的都是CAML. 简单的提一 ...
- [猜数字]把两个数和告诉A,积告诉B,求这两个数是什么
1-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少? 分析: 设和为S,积为M. 首先,A:我不知道. 说明:S可以分解成多个 ...