|
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.
|