15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Динамическая загрузка DLL

DLL возможно загружать двумя способами:

  - статически
  - динамически


Давайте создадим простую библиотеку DLL:

Project file name: c:\example\exdouble\exdouble.dpr

----------------------------------------------------------------------
library ExDouble;
// my simple dll

function calc_double ( r: real ): real; stdcall;
begin
     result := r * 2;
end;

exports
  calc_double index 1;

end;
----------------------------------------------------------------------

Теперь посмотрим, как её можно загружать:


СТАТИЧЕСКАЯ ЗАГРУЗКА DLL
==================

При таком способе загрузки достаточно поместить файл DLL в директорию приложения или в директорию Windows, или в Windows\System, Windows\Command. Однако, если система не найдёт этого файла в этих директория, то высветится сообщение об ошибке (DLL не найдена, или что-то в этом духе).

----------------------------------------------------------------------
unit untMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

function calc_double ( r: real ): real; stdcall; external 'ExDouble.dll';

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
     // в окошке сообщения будет цифра 21
     showMessage ( floatToStr ( calc_double ( 10.5 ) ) );
end;

end.
----------------------------------------------------------------------

ДИНАМИЧЕСКАЯ ЗАГРУЗКА DLL
===================

При динамической загрузке требуется написать немного больше кода.


А вот как это выглядит:
----------------------------------------------------------------------

unit untMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  Tcalc_double = function  ( r: real ): real;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
   hndDLLHandle: THandle;
   calc_double: Tcalc_double;
begin
     try
        // загружаем dll динамически
        hndDLLHandle := loadLibrary ( 'ExDouble.dll' );

        if hndDLLHandle <> 0 then begin

           // получаем адрес функции
           @calc_double := getProcAddress ( hndDLLHandle, 'calc_double' );

           // если адрес функции найден
           if addr ( calc_double ) <> nil then begin
              // показываем результат ( 21...)
              showMessage ( floatToStr ( calc_double ( 10.5 ) ) );
           end else
              // DLL не найдена ("handleable")
              showMessage ( 'Function not exists...' );

        end else
           // DLL не найдена ("handleable")
           showMessage ( 'DLL not found...' );

     finally
        // liberar
        freeLibrary ( hndDLLHandle );
     end;
end;

end.
----------------------------------------------------------------------