Como escrever e chamar DLLs no Delphi
O código a seguir cria uma DLL contendo duas funções, Min e Max, com o objetivo de retornar o maior dos dois inteiros.
- Inicie um novo projeto de DLL em Delphi (Clique em Arquivo -> Novo, selecione DLL).
- Salve o projeto como delhpdll.
- Preencha o código na biblioteca conforme fornecido abaixo.
// 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.
- Crie e salve o projeto DLL.
(Se você é do tipo que gosta de linha de comando, pode simplesmente executar "dcc32 delhpdll.dpr" na linha de comando ... isso lhe dará a mesma DLL, mas sem as coisas do IDE ...).
Então você precisa de um aplicativo, para chamar a DLL:
- Inicie um novo projeto de aplicativo "principal".
- Faça todos os controles de GUI necessários para testar a DLL.
- Preencha o código-fonte para fazer a interface da DLL conforme fornecido abaixo.
//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.
- Vá, voe, execute seu programa.