Mmmmm... dll-ovi, paketi, plug-in-ovi... moja omiljena tema
Evo jednog prostog dll-a koji ce imati jednu funkciju:
Code:
library SimpleDll;
function Operation(X, Y: Integer): Integer; stdcall;
begin
Result := X + Y;
end;
exports
Operation;
begin
end.
Pisanje pocinje kljuconm recju
library sto znaci da pisemo dll.
Zatim pisemo funkcije. One koje ce programi moci da pozivaju treba da imaju definisanu konvenciju poziva. Standardno je da se koristi
stdcall. Ovo se pise jer drugacije konvencije poziva drugacije prosledjuju parametre.
Kada zavrsimo sa pisanjem funkcija ide
exports deo u kojem pisemo koje sve funkcije dozoljavamo programima da pozivaju.
Na kraju, izmedju
begin i
end mozemo staviti kod koji ce se pozvati prilikom ucitavanja dll-a.
Program koji koristi ovaj dll bi mogao ovako da izgleda:
Code:
program SimpleApplication;
{$APPTYPE CONSOLE}
{$DEFINE USE_LOADLIBRARY}
{$DEFINE USE_EXTERNAL}
uses
Windows;
{$IFDEF USE_EXTERNAL}
function OperationExternal(X, Y: Integer): Integer; stdcall;
external 'SimpleDll.dll' name 'Operation';
{$ENDIF}
var
{$IFDEF USE_LOADLIBRARY}
Module: HModule;
OperationProc: function(X, Y: Integer): Integer; stdcall;
{$ENDIF}
X, Y: Integer;
begin
Write('Unesite X: ');
ReadLn(X);
Write('Unesite Y: ');
ReadLn(Y);
{$IFDEF USE_EXTERNAL}
WriteLn('Rezultat operacije je: ', OperationExternal(X, Y));
{$ENDIF}
{$IFDEF USE_LOADLIBRARY}
WriteLn('Ucitavam funkciju iz dll-a');
Module := LoadLibrary('SimpleDll.dll');
if Module <> 0 then
begin
OperationProc := GetProcAddress(Module, 'Operation');
if Assigned(OperationProc) then
WriteLn('Rezultat operacije je: ', OperationProc(X, Y))
else
WriteLn('Funkcija nije nadjena');
FreeLibrary(Module);
end
else
WriteLn('Dll nije nadjen');
{$ENDIF}
ReadLn;
end.
Napravio sam par kompajlerskih direktiva da bi bilo lakse da probate razlicite nacine ucitavanja funkcije iz dll-a.
Postoje dva nacina. Koriscenje rezervisane reci
external i rucnim ucitavanjem dll-a i funkcije.
Kada se koristi
external rezervisana rec program jednostavno nece hteti da se pokrene ako dll ili funkcija u dll-u ne postoji, dok prilikom rucnog ucitavanja mozete nastaviti sa izvrsavanjem programa uz obavestenje da nije uspelo ucitavanje funkcije.
Eto... to je ukratko to.