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

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

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

[ Pregleda: 3029 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

indy
Nikola Knežević
EPFL
Lausanne

Član broj: 3152
Poruke: 144
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 - pre 237 meseci
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
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
66.228.70.*



+6 Profil

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

 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
66.228.70.*



+6 Profil

icon Re: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?29.10.2004. u 17:57 - pre 237 meseci
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.
 
Odgovor na temu

indy
Nikola Knežević
EPFL
Lausanne

Član broj: 3152
Poruke: 144
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 - pre 237 meseci
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
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
66.228.70.*



+6 Profil

icon Re: Kako u Dll-u alocirati memoriju koja će se dealocirati iz pozivaoca?29.10.2004. u 20:07 - pre 237 meseci
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.
 
Odgovor na temu

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 - pre 237 meseci
Probaj da koristis API funkcije HeapAlloc() i HeapFree() umjesto malloc() i free().
Slavisa
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
66.228.70.*



+6 Profil

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

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 - pre 237 meseci
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
 
Odgovor na temu

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

[ Pregleda: 3029 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

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