Статическая и динамическая загрузка 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.
Взято из https://forum.sources.ru