Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?

[es] :: C programiranje :: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?

[ Pregleda: 869 | Odgovora: 7 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

indy
Nikola Knežević
Lausanne

Član broj: 3152
Poruke: 137
212.200.116.*

Jabber: indy@elitesecurity.org


Profil

icon Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?29.10.2004. u 17:00

Kao što tema kaže...

hoću da napišem DLL, koji dobija char**, i na osnovu nekih prikupljenih podataka alocira dovoljno velik prostor i vraća pozivaocu, koji kasnije može da uradi free().
To trenutno ne radi, VC++ izbacuje neke greške (Heap i sl).

Ovo mi je potrebno da bih lišio pozivaoca da kreira dovoljno velik bafer (a često neće), pa da ne bi morao ponovo da poziva, kupi ostatak. takođe, mora da prosledi i veličinu bafera, što bih ovako izbegao. Ali ne vidim načina da to uradim.

Ima li neko ideju kako? Primer?

Hvala
:*a programmer types in code, compiles it, runs it, and waits for
it to crash. Programs that don't crash are presumed to be running
correctly." - UNIX Haters Handbook
29.10.2004. u 17:00 

Dragi Tata

Član broj: 1958
Poruke: 3885
66.228.70.*

Sajt: www.novetehnologije.com


Profil

icon Re: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?29.10.2004. u 17:54
Linkuj i exe i dll dinamički sa CRT-om.

29.10.2004. u 17:54 

Dragi Tata

Član broj: 1958
Poruke: 3885
66.228.70.*

Sajt: www.novetehnologije.com


Profil

icon Re: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?29.10.2004. u 17:57
Ups, tek sad videh ovo:

Citat:

Ovo mi je potrebno da bih lišio pozivaoca da kreira dovoljno velik bafer (a često neće), pa da ne bi morao ponovo da poziva, kupi ostatak. takođe, mora da prosledi i veličinu bafera, što bih ovako izbegao. Ali ne vidim načina da to uradim.


Ako praviš bibliteku za nekog drugog, zaboravi na dinamičko linkovanje jer nemaš načina da nateraš mušteriju da i on to uradi. Ostaje ti samo da radiš kao u WinAPI funkcijama: korisnik ima sam da alocira memoriju i da ti prosledi veličinu alocirane memorije kao poseban parametar. Ako ta veličina nije dovoljna, prijaviš mu grešku.
29.10.2004. u 17:57 

indy
Nikola Knežević
Lausanne

Član broj: 3152
Poruke: 137
212.200.116.*

Jabber: indy@elitesecurity.org


Profil

icon Re: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?29.10.2004. u 19:16
Bedak, baš sam se nadao da postoji način, ali eto... Surov je život.
Može li neko kraće objašnjenje zašto to nije moguće?

Hvala.
:*a programmer types in code, compiles it, runs it, and waits for
it to crash. Programs that don't crash are presumed to be running
correctly." - UNIX Haters Handbook
29.10.2004. u 19:16 

Dragi Tata

Član broj: 1958
Poruke: 3885
66.228.70.*

Sajt: www.novetehnologije.com


Profil

icon Re: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?29.10.2004. u 20:07
Problem je što kad statički linkuješ CRT, svaki modul ima posebnu instancu istog.
Kad uradiš malloc u tvom dll-u, instanca CRT-a koja je linkovana uz taj dll "zna" kako da oslobodi tu memoriju, ali ako pozoveš free iz nekog drugog modula(npe exe fajla), taj zahtev će da ode instanci CRT-a koja je linkovana uz taj modul a ne onoj koja je izvršila alokaciju. U principu, možeš da iz tvog dll-a eksportuješ neku funkciju tipa Release() koju bi korisnik zvao umesto free(), ali treba verovati korisniku da će da se seti da je pozove kad treba.

Generalno uzev, kod rada sa dll-ovima imaš dva izbora:

1. Koji modul alocira memoriju, mora i da je dealocira.
2. Dinamički linkuj CRT da ga dele svi moduli i onda nema problema.

Pošto, kako razumem, nemaš kontrolu nad korisnikom (ne možeš da ga "nateraš" da dinamički linkuje CRT) bojim se da ti ostaje samo 1-va opcija.
29.10.2004. u 20:07 

Slavisa
Slavisa Dojcinovic
JKP Cistoca
Banjaluka

Član broj: 9861
Poruke: 44
*.teleklik.net.



Profil

icon Re: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?29.10.2004. u 20:14
Probaj da koristis API funkcije HeapAlloc() i HeapFree() umjesto malloc() i free().
Slavisa
29.10.2004. u 20:14 

Dragi Tata

Član broj: 1958
Poruke: 3885
66.228.70.*

Sajt: www.novetehnologije.com


Profil

icon Re: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?29.10.2004. u 20:30
I meni je to palo na pamet, ali kako da natera korisnika da koristi HeapFree() umesto free() ?
29.10.2004. u 20:30 

Slavisa
Slavisa Dojcinovic
JKP Cistoca
Banjaluka

Član broj: 9861
Poruke: 44
*.teleklik.net.



Profil

icon Re: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?29.10.2004. u 20:51
Moze da navede u dokumentaciji da za oslobadjanje memorije treba koristiti HeapFree().
Mada ako vec treba da napise funkciju int NekaFunckija(char **pp); onda moze da napise jos jednu void OslobodiMem(char *p);


Slavisa
29.10.2004. u 20:51 

[es] :: C programiranje :: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?

[ Pregleda: 869 | Odgovora: 7 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.