delphi DLL动态链接库

末鹿安然 提交于 2019-12-22 08:43:03

假设有两个应用程序,它们都要调用一个单元中的一个方法,那么这两个应用程序都要在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;

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!