[ reiser @ 06.05.2005. 13:08 ] @
Moze li se sa GetProcAddress() funkcijom dobiti pointer ka nekoj funkciji iz odredjenog DLL-a, ciji handle dobijam sa LoadLibrary() ? Ali, ne preko imena funkcije vec preko njenog ordinal broja ? Hvala |
[ reiser @ 06.05.2005. 13:08 ] @
[ reiser @ 07.05.2005. 05:36 ] @
Code: var Funkcija : procedure; stdcall; hLib : Cardinal; begin hLib := LoadLibrary('ime_library-a'); @Funkcija := GetProcAddress(hLib, PAnsiChar(LOWORD(ordinal_fje))); FreeLibrary(hLib); If @Funkcija = nil Then Exit; Resio sam problem. [ morlic @ 07.05.2005. 09:26 ] @
Pazi, u primeru se radi odmah FreeLibrary(). Posle toga ne mozes koristiti funkciju ciju si adresu dobio. Znaci poziva se po zavrsetku koriscenja funkcije.
Naravno moras da pazis sta radis i ako funkcija koju pozivas radi u nekoj vrsti asinhronog rezima, tj. vraca izvrsavanje odmah na tvoj kod, ali inicira neki proces unutar dll-a koji se ne zavrsava tako brzo. Mada mislim da ces retko koristiti takve stvari, barem ne dinamicki. [ reiser @ 07.05.2005. 15:09 ] @
Hvala, tek sam danas uocio da posle FreeLibrary() ucitana funkcija nece raditi. A shvatio sam i zasto ;)
Reci mi jos ovo. GetModuleHandle vraca handle do VEC UCITANOG modula, odnosno DLLa ? To znaci da ako GetModuleHandle vrati 0, nijedan proces nece moci da poziva fje iz tog dll-a, vec mora prvo sa LoadLibrary da ucita taj dll ? [ morlic @ 07.05.2005. 16:17 ] @
Svaki proces posebno ucitava dll, i handle iz jednog procesa nije moguce koristiti u drugom procesu. Znaci modul mora biti ucitan da bi se ovom funkcijom dobio handle.
Kada uradis FreeLibrary() handle koji si eventualno ranije uzeo u toku rada programa nece biti vazeci, tako da moras da pazis kako radis sa FreeLibrary() ili koristi GetModuleHandleEx() sa flagom GET_MODULE_HANDLE_EX_FLAG_PIN, koji ti omogucava da se "osiguras" od FreeLibrary(). Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|