- DLL 有用資源
- DLL - 快速指南
- DLL - 有用資源
- DLL - 討論
如何在 Delphi 中編寫和呼叫 DLL
以下程式碼建立一個包含兩個函式(Min 和 Max)的 DLL,其目的是返回兩個整數中較大的一個。
- 在 Delphi 中啟動一個新的 DLL 專案(單擊檔案 -> 新建,選擇 DLL)。
- 將專案儲存為 delhpdll。
- 在庫中填寫以下程式碼。
// Uffe wrote: This is a toy dll to demonstrate the
// use of dll's
//
// The libary export two functions Max and Min
//
// The dll matches the MainProject which is a Delphi
// project which calls the DLL.
//{
// DELPHI WROTE THIS:
// Important note about DLL memory management: ShareMem
// must be the first unit in your library's USES clause
// AND your project's (select Project-View Source) USES
// clause if your DLL exports any procedures or functions
// that pass strings as parameters or function results.
// This applies to all strings passed to and from your
// DLL--even those that are nested in records and classes.
// ShareMem is the interface unit to the BORLNDMM.DLL
// shared memory manager, which must be deployed along
// with your DLL. To avoid using BORLNDMM.DLL, pass
// string information using PChar or ShortString
// parameters.
//}
uses
SysUtils,
Classes;
// Declare stdcall to make interface to other languages
function Min(X, Y: Integer): Integer; stdcall;
begin
if X < Y then Min := X else Min := Y;
end;
function Max(X, Y: Integer): Integer; stdcall;
begin
if X > Y then Max := X else Max := Y;
end;
exports // Make available to calling applications
Min index 1,
Max index 2;
begin
end.
- 構建並儲存 DLL 專案。
(如果你喜歡命令列,你可以直接從命令列執行 "dcc32 delhpdll.dpr" ... 這樣便得到了相同的 DLL,但沒有 IDE 的內容 ...)。
然後你需要一個應用程式來呼叫 DLL
- 啟動一個新的“主”應用程式專案。
- 製作測試 DLL 所需的 GUI 控制元件。
- 填寫以下程式碼來對接 DLL 的原始碼。
//Main Applet to demonstrate how to call a dll.
//
// SEARCH PATHS:
// The code makes no special effort to search for the DLL.
// Easiest if everything (including DLL) is in the same
// directory.
//
//DLL CALLING:
// This applet demonstrates both Win API calling and
// external calling (see below)
//
//
// NOTICE: I wasted a lot of time not declaring the
// functions "stdcall" throughout. If you
// declare it "stdcall" in the DLL and not
// in the calling application, then you get hard-to-find
// errors - "external" will crash on you,
// the Win API does not type-check so the function
// just gives "weird" results. (OK this is
// obvious when you think about it .. problem is,
// I didn't)
// Jump to "implementation" section,
// no DLL specs before.
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
// TMaxFun becomes a function variable (think of
// a "pointer to function" without the pointer)
TMaxFun = function(i,j: integer):integer; stdcall;
var
Form1: TForm1;
implementation
{$R *.DFM}
// This declares Max as a function which should be found
// externally, in the dll
function Max(i,j:integer): integer; stdcall; external 'delhpdll.dll';
// This procedure uses the "external" call to the DLL
procedure TForm1.Button1Click(Sender: TObject);
var
i,j: integer;
begin
i := strtoint(Edit1.Text);
j := strtoint(Edit2.Text);
Label1.Caption := inttostr(Max(i,j));
// Easy, eh?
end;
// This calls the DLL directly through the Win API.
// More code, more control.
procedure TForm1.Button2Click(Sender: TObject);
var
i,j,k: integer;
Handle: THandle;
// mmax is a function variable; see type declaration
// of TMaxFun above.
mmax : TMaxFun;
begin
i := strtoint(Edit1.Text);
j := strtoint(Edit2.Text);
// Load the library
Handle := LoadLibrary('DELHPDLL.DLL');
// If succesful ...
if Handle <> 0 then
begin
// Assign function Max from the DLL to the
// function variable mmax
@mmax := GetProcAddress(Handle, 'Max');
// If successful
if @mmax <> nil then
begin
k := mmax(i,j);
Label1.Caption := inttostr(k);
end;
// Unload library
FreeLibrary(Handle);
end;
end;
end.
- 好了,執行你的程式。
dll_examples.htm
廣告