Статическая и динамическая загрузка DLL

Материал из DRKB

Статическая и динамическая загрузка 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 
        // Функция 'calc_double' в DLL не найдена 
        ShowMessage('Function not exists...'); 
      end;
    end
    else 
      // DLL не найдена
      ShowMessage('DLL not found...'); 
  finally 
    // liberar 
    FreeLibrary(hndDLLHandle); 
  end; 
end; 

end.


Source: Взято из http://forum.sources.ru
ID: 01990