假设有两个应用程序,它们都要调用一个单元中的一个方法,那么这两个应用程序都要在Uses语句中引用该单元。如果同时运行这两个应用程序,这个方法就会在内存中存在两份,这显然是内存的一种浪费,使用动态链接库就可以解决这个问题。
动态链接库DLL与其他应用程序通过动态链接技术来共享代码。如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个DLL的进程的地址空间,在Win32系统中,每个进程拥有自己的32位线性地址空间。如果一个DLL被多个进程调用,每个进程都会收到该DLL的一份映射。在Win32中,DLL可以看作是每个进程自己的代码。但是这并不是说物理内存中会分配DLL的多个实例。
DLL的优点:
(1) 共享代码、资源和数据
(2) 隐藏实现的细节
例如我们创建一个引用DLL的例子
(1) 新建――other---DLL Wizard 命名为:DLLTest
(2) 写一个加法函数
uses
SysUtils,
Classes;
function AddMethod(Num1,Num2 : Integer) : Integer ;stdcall; //定义简单加法函数
begin
Result := Num1 + Num2;
end;
exports //exports 子句用于引出DLL中要被其他应用程序调用 的函数或过程。
AddMethod;
(3) 生成DLLTest.dll, 复制DLLTest.dll将其放在要引用该DLL项目工程下。
(4) var
Form10: TForm10;
function AddMethod(Num1,Num2 : Integer) : Integer ;stdcall; external 'DLLTest.DLL' //声明DLL方法
name 'AddMethod';
implementation
{$R *.dfm}
procedure TForm10.btnEqualClick(Sender: TObject);
var
num1, num2 : Integer;
begin
num1 := StrToInt(edtFirst.Text );
num2 :=StrToInt(edtSecond.Text );
edtResult.Text :=IntToStr(AddMethod(num1,num2)); //直接使用DLL中的方法
end;
来源:https://www.cnblogs.com/taofengli288/archive/2011/09/06/2168669.html