Ĺadny brzuch
Mam kodzik z 4p. dll'ka
library SimpleDLL; uses Windows; procedure About(test: PAnsiChar); stdcall; begin MessageBox(0, test, 'Hello', MB_OK + MB_ICONINFORMATION); end; exports About name 'About'; begin end.
Dodałem do niego tylko (test: PAnsiChar)
I teraz ładuje w programie tą bilbioteke dynamicznie:
procedure TForm1.Button1Click(Sender: TObject); var DLL : THandle; About : procedure; begin DLL := LoadLibrary('Test.dll'); // załadowanie pliku try @About := GetProcAddress(DLL, 'About'); // pobranie wskaźnika do procedury if @About = nil then raise Exception.Create('Nie można załadować procedury'); About; // wykonanie procedury finally FreeLibrary(DLL); end; end; end.
No i mój problem w tym - jak mieć wpływ na argument Test w procedurze About?
Bo wywołanie procedury w sposób About('tralala'); kończy się errorem :/
Użytkownik pat edytował ten post 22 lipiec 2007, 18:57
Przeanalizuj swoj kod, powoli i dokladnie.
W dllu masz:
procedure About(test: PAnsiChar); stdcall;
a w programie:
var
  DLL : THandle;
  About : procedure;
Widzisz roznice?
W programie probujesz wywolac z parametrem procedure ktora parametru nie wymaga.
już to dawno zauważyłem tylko - nie wiem jak to rozwiązać -
About(test: PAnsiChar): procedure; <- tak na pewno nie działa
procedure TForm1.Button1Click(Sender: TObject); type MyAbout = procedure(test: PAnsiChar); stdcall; var DLL : THandle; About : MyAbout; begin DLL := LoadLibrary('Test.dll'); // załadowanie pliku try About := GetProcAddress(DLL, 'About'); // pobranie wskaźnika do procedury if @About = nil then raise Exception.Create('Nie można załadować procedury'); About('ble'); // wykonanie procedury finally FreeLibrary(DLL); end; end; end.
Użytkownik PcSA edytował ten post 22 lipiec 2007, 21:12
O.o dzięki PcSA ;)
Działa bez zarzutów :)
już to dawno zauważyłem tylko - nie wiem jak to rozwiązać -
About(test: PAnsiChar): procedure; <- tak na pewno nie działa No nie zadziala, bo przy deklarowaniu typu procedurki/funkcji - widzisz to w kodzie PcSa - parmetry podajesz po slowie kluczowym procedure/function.
Przeanalizuj kody wtyczek roznych programow, najlepiej w delphi, wtedy sie duzo nauczysz.
PS.
Funkcje deklarujesz w ten sposob:nazwa_unkcji : function (parametr1 : typ; Parametr2 : typ) : Â typ; stdcall;
PcSa - a po co jeszcze nowe typy danych robic? Ja takie dynamiczne funkcje deklaruje tak:var<BR> About : procedure(test: PAnsiChar); stdcall; <BR>Jest prosciej a efekt ten sam (dziala ;)).
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
library SimpleDLL; uses Windows; procedure About(test: PAnsiChar); stdcall; begin MessageBox(0, test, 'Hello', MB_OK + MB_ICONINFORMATION); end; exports About name 'About'; begin end.
Dodałem do niego tylko (test: PAnsiChar)
I teraz ładuje w programie tą bilbioteke dynamicznie:
procedure TForm1.Button1Click(Sender: TObject); var DLL : THandle; About : procedure; begin DLL := LoadLibrary('Test.dll'); // załadowanie pliku try @About := GetProcAddress(DLL, 'About'); // pobranie wskaźnika do procedury if @About = nil then raise Exception.Create('Nie można załadować procedury'); About; // wykonanie procedury finally FreeLibrary(DLL); end; end; end.
No i mój problem w tym - jak mieć wpływ na argument Test w procedurze About?
Bo wywołanie procedury w sposób About('tralala'); kończy się errorem :/
Użytkownik pat edytował ten post 22 lipiec 2007, 18:57
Przeanalizuj swoj kod, powoli i dokladnie.
W dllu masz:
procedure About(test: PAnsiChar); stdcall;
a w programie:
var
  DLL : THandle;
  About : procedure;
Widzisz roznice?
W programie probujesz wywolac z parametrem procedure ktora parametru nie wymaga.
już to dawno zauważyłem tylko - nie wiem jak to rozwiązać -
About(test: PAnsiChar): procedure; <- tak na pewno nie działa
procedure TForm1.Button1Click(Sender: TObject); type MyAbout = procedure(test: PAnsiChar); stdcall; var DLL : THandle; About : MyAbout; begin DLL := LoadLibrary('Test.dll'); // załadowanie pliku try About := GetProcAddress(DLL, 'About'); // pobranie wskaźnika do procedury if @About = nil then raise Exception.Create('Nie można załadować procedury'); About('ble'); // wykonanie procedury finally FreeLibrary(DLL); end; end; end.
Użytkownik PcSA edytował ten post 22 lipiec 2007, 21:12
O.o dzięki PcSA ;)
Działa bez zarzutów :)
już to dawno zauważyłem tylko - nie wiem jak to rozwiązać -
About(test: PAnsiChar): procedure; <- tak na pewno nie działa No nie zadziala, bo przy deklarowaniu typu procedurki/funkcji - widzisz to w kodzie PcSa - parmetry podajesz po slowie kluczowym procedure/function.
Przeanalizuj kody wtyczek roznych programow, najlepiej w delphi, wtedy sie duzo nauczysz.
PS.
Funkcje deklarujesz w ten sposob:nazwa_unkcji : function (parametr1 : typ; Parametr2 : typ) : Â typ; stdcall;
PcSa - a po co jeszcze nowe typy danych robic? Ja takie dynamiczne funkcje deklaruje tak:var<BR> About : procedure(test: PAnsiChar); stdcall; <BR>Jest prosciej a efekt ten sam (dziala ;)).