动态链接库(Dynamic Link Library)
- 不是可执行的二进制文件
- 包含一个可以由多个程序同时使用的代码和数据的库
- 一般位于windows/system32下
调用dll的方式
- 外部声明
- 动态加载
创建dll
library TestDll;
uses
SysUtils,
Classes;
{$R *.res}
function min(num1,num2 : Integer) : Integer;stdcall;
begin
if num1 < num2 then
Result := num1
else
Result := num2;
end;
exports
min;
begin
end.
调用dll
- 外部声明(静态调用)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; function min(num1,num2 : Integer) : Integer;stdcall; external 'TestDll.dll' name 'min'; type TForm1 = class(TForm) edt1: TEdit; edt2: TEdit; btn1: TButton; procedure btn1Click(Sender: TObject); private public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btn1Click(Sender: TObject); var N1,N2 : Integer; begin N1 := StrToInt(edt1.Text); N2 := StrToInt(edt2.Text); ShowMessage( IntToStr( min(N1,N2) ) ); end; end.
- 动态加载
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) edt1: TEdit; edt2: TEdit; btn1: TButton; procedure btn1Click(Sender: TObject); private public { Public declarations } end; TMin = function (num1,num2 : Integer): Integer; stdcall; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btn1Click(Sender: TObject); var OneHandle : THandle; //定义一个句柄变量 min : TMin; begin OneHandle := LoadLibrary('TestDll.dll'); try if OneHandle <> 0 then //如果载入成功则获取ShowCalendar函数的地址 @min := GetProcAddress(OneHandle, 'min'); if not (@min = nil) then //如果找到该函数则在主窗体的Label1中显示DLL窗体中设定的日期 ShowMessage( IntToStr(min(StrToInt(edt1.Text),StrToInt(edt2.Text)))); finally FreeLibrary(OneHandle); //调用完毕收回DLL占用的资源 end; end; end.