Zewnetrzna DLL + API w Delphi

0

Witam wszystkich,

Chcialbym poprosic o pomoc, chocby sam pocztatek, czyli jak sie tego zabrac. Sytuacja wyglada nastepujaco: mam zewnetrzna biblioteke DLL przez ktora moge laczyc sie do programu X oraz API do tej bliblioteki. I teraz:

W sekcji type utworzylem typ:

 T_initialize = procedure(host: String; login: String; password: String);

Nastepnie dalej zadeklarowalem funkcje, ktora bede chcial uzywac. Funkcja znajduje sie w DLL-ce.
procedure FAPI_Init(host: String; login: String; password: String); stdcall external 'biblioteka.dll' name 'FAPI_Init';

Funkacja umozliwia nawiazanie polaczenia z programem X.

Nastepnie gdzies na dole chcialem wykorzystac te funkcje. Wrzucilem kod pod buttona:

procedure TB_RT2004.Button1Click(Sender: TObject);
var
  TDLL_initialize :   T_initialize;


begin
  DLL := LoadLibrary('biblioteka.dll'); // laduj biblioteke
  try
    @TDLL_initialize := GetProcAddress(DLL, 'FAPI_Init');

    if @TDLL_initialize = nil then raise Exception.Create('Bład - nie mogę znaleźć proceudry w bibliotece!');

    TDLL_initialize('127.0.0.1','jkowalski','123456'); // wywolaj procedure z biblioteki
  finally
    FreeLibrary(DLL); // zwolnij pamiec
  end;
end;

Wiem, ze funkcja FAPI_Init zwraca uchwyt do połączenia z programem X lub NULL w przypadku braku możliwości nawiązania połączenia.

Chcialbym teraz jakos zadeklarowac typ do tego uchwytu, poniewaz wszystkie inne funkcje API wymagaja tego uchwytu jako parametru. Czy ktos z Was moglby mi podpowiedziec jak to zadeklarowac...???

Serdeczni pozdrawiam

Marek

0

Zwyczajnie, deklarujesz jako funkcje i typ (skoro masz opis, to po prostu funkcja bedzie zwracac taki typ jaki jest w parametrach tych pozostalych funkcji).

Co do deklaracji poczytaj a ladowaniu dynamicznym i statycznym - razem ze startem programu.

to

 procedure FAPI_Init(host: String; login: String; password: String); stdcall external 'biblioteka.dll' name 'FAPI_Init';

powoduje, ze biblioteka jest wymagana do startu (nie odpali sie program bez niej).
Pozostala czesc Twojego kodu to ladowanie dynamiczne

0

Dziekuje za odpowiedz, ale chyba sie nie zrozumielismy do konca :)

Chcialbym dodac jakas zmienna (chyba typu THandle), tak abym wywolujac funkcje inicjalizujaca polaczenie mial juz na caly czas zycia programu uchwyt do tego polaczenia i dzieku temu mogl wywolywac inne funkce API.

var x : THandle;

i potem w kodzie: x := TDLL_initialize('127.0.0.1','jkowalski','123456');

...czy jakos tak

Pozdrawiam

0

Ja zrozumialem. To co napisalem jest ok, po poczytaniu helpa albo czegokolwiek (wskazowki dalem)
dalo by

T_initialize = function(host: String; login: String; password: String):THandle;

albo (i tu zwracam uwage, albo jedno albo drugie bo nie ma potrzeby obu!)

function FAPI_Init(host: String; login: String; password: String):THandle; stdcall external 'biblioteka.dll' name 'FAPI_Init';

1 użytkowników online, w tym zalogowanych: 0, gości: 1