unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, 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

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type
   //Typy procedur i funkcji z naszej biblioteki DLL
   DLLTestType = procedure;
   DLLTestType4 = function(argument :String) :Integer; StdCall; //Tu ma znaczenie StdCall bo pojawia sie argument
   DLLTestType5 = function(argument :PChar) :Integer; StdCall;
   DLLTestType6 = function(argument :Pointer) :Integer; StdCall;
var
   DLLHandle :THandle;
   ATest1,ATest2,ATest3 :DLLTestType;
   ATest4 :DLLTestType4;
   ATest5 :DLLTestType4;
   ATest6 :DLLTestType6;
   wynik :Integer;
   s :String;
begin
DLLHandle:=LoadLibrary('Project1.dll');
if (DLLHandle<>0) then
   ShowMessage('Wczytanie biblioteki udało się')
   else
   ShowMessage('Wczytanie biblioteki nie powiodło się');

@ATest1:=GetProcAddress(DLLHandle, 'Test1');
@ATest2:=GetProcAddress(DLLHandle, 'Test2');
@ATest3:=GetProcAddress(DLLHandle, 'Test3');

if (@ATest1=nil) then ShowMessage('Uruchomienie Test1 nie jest możliwe')
                 else ATest1;
if (@ATest2=nil) then ShowMessage('Uruchomienie Test2 nie jest możliwe')
                 else ATest2;
if (@ATest3=nil) then ShowMessage('Uruchomienie Test3 nie jest możliwe')
                 else ATest3;

@ATest4:=GetProcAddress(DLLHandle, 'Test4');
if (@ATest4=nil) then
   ShowMessage('Uruchomienie Test4 nie jest możliwe')
   else
   begin
   wynik:=ATest4('Przykładowy łańcuch');
   ShowMessage('Wynik funkcji Test4: '+IntToStr(wynik));
   end;

@ATest5:=GetProcAddress(DLLHandle, 'Test5');
if (@ATest5=nil) then
   ShowMessage('Uruchomienie Test5 nie jest możliwe')
   else
   begin
   wynik:=ATest5('Przykładowy łańcuch');
   ShowMessage('Wynik funkcji Test5: '+IntToStr(wynik));
   end;

@ATest6:=GetProcAddress(DLLHandle, 'Test6');
if (@ATest6=nil) then
   ShowMessage('Uruchomienie Test6 nie jest możliwe')
   else
   begin
   s:='Przykładowy łańcuch';
   wynik:=ATest6(@s);
   ShowMessage('Wynik funkcji Test6: '+IntToStr(wynik));
   end;

if (FreeLibrary(DLLHandle)) then
   ShowMessage('Usunięcie biblioteki z pamięci udało się')
   else
   ShowMessage('Usunięcie biblioteki z pamięci nie powiodło się');
end;

end.
