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.