Jump to content
Che

[C++][NELAMURIRE] Unload/FreeLibrary(MyDLL.dll) prin metoda asta ?

Recommended Posts

Posted

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 !

Posted

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 !

Posted

@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;
}

  • Upvote 1
Posted
@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.

Posted (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 by Nytro
Posted

@Nytro

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.

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! :)

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...