Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007

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.

Взято из https://forum.sources.ru