[ indy @ 29.10.2004. 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 |
[ Dragi Tata @ 29.10.2004. 17:54 ] @
Linkuj i exe i dll dinamički sa CRT-om.
[ Dragi Tata @ 29.10.2004. 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.
[ indy @ 29.10.2004. 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.
[ Dragi Tata @ 29.10.2004. 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.
[ Slavisa @ 29.10.2004. 20:14 ] @
Probaj da koristis API funkcije HeapAlloc() i HeapFree() umjesto malloc() i free().
[ Dragi Tata @ 29.10.2004. 20:30 ] @
I meni je to palo na pamet, ali kako da natera korisnika da koristi HeapFree() umesto free() ?
[ Slavisa @ 29.10.2004. 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);
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.