1 . create DLL (方法1):
library MyDLL;
uses
SysUtils,
Classes,
DLL in ' DLL.pas ' ;
... {$R *.res}
exports
AddIt, SubIt;
begin
end.
unit DLL; // 新增一個單元文件
interface
function AddIt(x1, x2: Integer): Integer; stdcall;
function SubIt(x1, x2: Integer): Integer; stdcall;
implementation
function AddIt(x1, x2: Integer): Integer; stdcall;
begin
result : = x1 + x2; // or AddIt := x1 + x2;
end;
function SubIt(x1, x2: Integer): Integer; stdcall;
begin
result : = x1 - x2; // or SubIt := x1 - x2;
end;
end.
create DLL (方法2):
library MyDLL;
uses
SysUtils,
Classes,
function AddIt(x1, x2: Integer): Integer; export;
begin
result : = x1 + x2; // or AddIt := x1 + x2;
end;
function SubIt(x1, x2: Integer): Integer; export;
begin
result : = x1 - x2; // or SubIt := x1 - x2;
end
... {$R *.res}
exporTs
AddIt, SubIt;
begin
end.
2 . Static Call DLL
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class (TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
... { Private declarations }
public
... { Public declarations }
end;
var
Form1: TForm1;
implementation
function AddIt(x1, x2: Integer): Integer; stdcall; external ' MyDLL.dll ' ;
function SubIt(x1, x2: Integer): Integer; stdcall; external ' MyDLL.dll ' ;
... {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if (Edit1.Text <> '' ) and (Edit2.Text <> '' ) then
begin
try
Label1.Caption : = IntToStr( AddIt(StrToInt(Edit1.Text), StrToInt(Edit2.Text)) );
Label2.Caption : = IntToStr( SubIt(StrToInt(Edit1.Text), StrToInt(Edit2.Text)) );
except
ShowMessage( ' Input an integer number! ' );
Edit1.SetFocus;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text : = IntToStr(Random(Width));
Edit2.Text : = IntToStr(Random(Width));
end;
end.
3 . Automatic Call DLL
unit AutoDLL;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyDLL = function(x, y: Integer): Integer; stdcall;
TForm1 = class (TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Button2: TButton;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
... { Private declarations }
public
... { Public declarations }
end;
var
Form1: TForm1;
Gv_DLLHandle: THandle;
Gv_DLLPointer: Pointer;
Gv_MyDLLFunc: TMyDLL;
implementation
... {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if (Edit1.Text = '' ) or (Edit2.Text = '' ) then
Exit;
Gv_DLLHandle : = LoadLibrary( ' MyDLL.dll ' );
if Gv_DLLHandle > 0 then // 判斷句柄是否有值﹐有值為載入成功
try
Gv_DLLPointer : = GetProcAddress(Gv_DLLHandle, PChar( ' AddIt ' )); // 根據函數名稱獲得函數指針
if Gv_DLLPointer <> nil then // 判斷Gv_DLLPointer是否為空指針﹐不為空則為得到了函數地址
begin
Gv_MyDLLFunc : = TMyDLL(Gv_DLLPointer); // 將指針強制轉換為函數指針
try
Label1.Caption : = IntToStr(Gv_MyDLLFunc( StrToInt(Edit1.Text), StrToInt(Edit2.Text) ));
except
ShowMessage( ' Input an integer number! ' );
end;
end
else
ShowMessage( ' No found "AddIt" ' );
Gv_DLLPointer : = GetProcAddress(Gv_DLLHandle, PChar( ' SubIt ' ));
if Gv_DLLPointer <> nil then
begin
Gv_MyDLLFunc : = TMyDLL(Gv_DLLPointer);
try
Label2.Caption : = IntToStr(Gv_MyDLLFunc(StrToInt(Edit1.Text), StrToInt(Edit2.Text)));
except
ShowMessage( ' Input an integer number! ' );
end;
end
else
ShowMessage( ' No found "SubIt" ' );
finally
FreeLibrary(Gv_DLLHandle); // 釋放DLL
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text : = IntToStr(Random(Height));
Edit2.Text : = IntToStr(Random(Height));
end;
end.