Che Posted January 8, 2015 Report Posted January 8, 2015 Scopul unui fisier *.dll este acela de a fi incarcat in memorie doar cand ai nevoie de el si apoi logic ar fi sa eliberezi dll-ul din memorie. Practic load-use-unload.In C++ este metoda de a elibera din memorie dll-ul de care nu mai ai nevoie prin functia FreeLibrary care face treaba asta.FreeLibrary:BOOL WINAPI FreeLibrary( _In_ HMODULE hModule);O singura nelamurire am:Cand incarci un fisier *.dll in programul tau prin metoda asta: Cum eliberezi memoria de acel dll ? Mai merge tot cu FreeLibrary ? Cum ?Multumesc ! Quote
Erase Posted January 8, 2015 Report Posted January 8, 2015 Documenteaza-te despre functia GetModuleHandle si posteaza apoi daca mai ai alte nelamuriri. Quote
aphex Posted January 8, 2015 Report Posted January 8, 2015 FreeLibrary nu este o metoda a C++ este un Windows API si este generic valabil ptr orice limbaj de programare.Referitor la intrebarea ta in video de mai sus adaugi libraria la dependintele proiectului asta inseamna ca modulul este incarcat de sistemul de operare si tot el este responsabil ptr eliberarea lui. Cum stie sistemul sa incarce acel modul ? Citeste despre IAT (Import Allocation Table). In general ca fapt general nu trebuie sa te preocupe eliberarea unor resurse de care se ocupa sistemul de operare compilatorul etc. Adica daca aloci memorie trebuie sa o si eliberezi daca nu esti tu cel care aloca memoria atunci nu e treaba ta. Sper ca ai inteles.Scopul unui fisier *.dll este acela de a fi incarcat in memorie doar cand ai nevoie de el si apoi logic ar fi sa eliberezi dll-ul din memorie. Practic load-use-unload.In C++ este metoda de a elibera din memorie dll-ul de care nu mai ai nevoie prin functia FreeLibrary care face treaba asta.FreeLibrary:BOOL WINAPI FreeLibrary( _In_ HMODULE hModule);O singura nelamurire am:Cand incarci un fisier *.dll in programul tau prin metoda asta: Cum eliberezi memoria de acel dll ? Mai merge tot cu FreeLibrary ? Cum ?Multumesc ! Quote
staticwater Posted January 8, 2015 Report Posted January 8, 2015 @Che,Intoteauna incarca dll-ul dinamic(nu static). Dupa ce ai apelat functia LoadLibrary/LoadLibraryEx si handle-ul catre dll difera de NULL, apeleaza FreeLibrary.#include <windows.h> #include <stdio.h> typedef int (__cdecl *MYPROC)(LPWSTR); int main( void ) { HINSTANCE hinstLib; MYPROC ProcAdd; hinstLib = LoadLibrary("Path catre dll"); if (hinstLib != NULL) { ProcAdd = (MYPROC) GetProcAddress(hinstLib, "Numefunctie"); if (NULL != ProcAdd) { //apeleaza functia aici } FreeLibrary(hinstLib); } return 0;} 1 Quote
JIHAD Posted January 8, 2015 Report Posted January 8, 2015 @Che,Intoteauna incarca dll-ul dinamic(nu static). Dupa ce ai apelat functia LoadLibrary/LoadLibraryEx si handle-ul catre dll difera de NULL, apeleaza FreeLibrary.#include <windows.h> #include <stdio.h> typedef int (__cdecl *MYPROC)(LPWSTR); int main( void ) { HINSTANCE hinstLib; MYPROC ProcAdd; hinstLib = LoadLibrary("Path catre dll"); if (hinstLib != NULL) { ProcAdd = (MYPROC) GetProcAddress(hinstLib, "Numefunctie"); if (NULL != ProcAdd) { //apeleaza functia aici } FreeLibrary(hinstLib); } return 0;}un raspuns mai bun nici ca puteai primi. Quote
Nytro Posted January 8, 2015 Report Posted January 8, 2015 (edited) Nu apela FreeLibrary decat daca stii ca nu mai apelezi vreo functie.LoadLibrary face multe:- citeste un fisier de pe disk- scrie datele in memorie- incarca DLL-urile importate de acel DLL- face relocari...Sunt chestii care dureaza mult. Daca vrei sa apelezi functii dintr-un DLL, il incarci o data si apelezi metodele de care ai nevoie. Daca o sa il incarci si descarci din memorie la fiecare apel de functie, o sa mearga ca curul programul tau.Poti descarca din memorie un DLL cu GetModuleHandle (cum s-a spus mai sus) si FreeLibrary.Am vazut partial acel video. Acolo creaza un DLL si un EXE, iar EXE foloseste acel DLL. Daca te uiti atent, vei vedea ca adauga la setarile pentru linker LIB-ul acelui DLL. Acel lib face "legatura" dintre EXE si DLL, iar daca DLL-ul e creat de tine sau daca de exemplu folosesti un DLL din Windows (ex. ws2_32) ai la dispozitie acel lib necesar. Daca nu le ai, atunci poti folosi versiunea dinamica, altfel nu cred ca isi are rostul pentru ca te complici degeaba. Nota: https://www.google.com/search?q=dll+lib&ie=utf-8&oe=utf-8#safe=off&q=create+lib+from+dll Edited January 8, 2015 by Nytro Quote
staticwater Posted January 9, 2015 Report Posted January 9, 2015 @NytroSunt chestii care dureaza mult. Daca vrei sa apelezi functii dintr-un DLL, il incarci o data si apelezi metodele de care ai nevoie. Daca o sa il incarci si descarci din memorie la fiecare apel de functie, o sa mearga ca curul programul tau.Daca vrei sa apelezi functia de mai multe ori, normal ca n-o sa dai un LoadLibrary/FreeLibrary de fiecare data.Poti descarca din memorie un DLL cu GetModuleHandle (cum s-a spus mai sus) si FreeLibrary.Mare atentie la GetModuleHandle combinat cu FreeLibrary. GetModuleHandle returneaza handle-ul catre dll, dar nu incrementeaza reference count-ul. FreeLibrary in schimb decrementeaza reference count-ul.Disaster is imminent! Quote