Динамическая загрузка 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.
----------------------------------------------------------------------
|