Comment écrire et appeler des DLL dans Delphi

Le code suivant crée une DLL contenant deux fonctions, Min et Max, dans le but de renvoyer le plus grand de deux entiers.

  • Démarrez un nouveau projet DLL dans Delphi (cliquez sur Fichier -> Nouveau, sélectionnez DLL).
  • Enregistrez le projet sous delhpdll.
  • Remplissez le code dans la bibliothèque comme indiqué ci-dessous.
// 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.
  • Générez et enregistrez le projet DLL.

(Si vous êtes un type de ligne de commande, alors vous pouvez simplement exécuter "dcc32 delhpdll.dpr" à partir de la ligne de commande ... cela vous donnera la même DLL mais sans les éléments de l'IDE ...)

Ensuite, vous avez besoin d'une application, pour appeler la DLL:

  • Démarrez un nouveau projet d'application "principal".
  • Effectuez les contrôles GUI dont vous avez besoin pour tester la DLL.
  • Remplissez le code source pour interfacer la DLL comme indiqué ci-dessous.
//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.
  • Allez, volez, exécutez votre programme.