[ toxi_programer @ 12.11.2006. 19:31 ] @
Uradim ovo:
__gc String *text = new String("neka poruka");

E sad,ako da se izvrsi konverzija iz String u char * ? Jasno je da ovo nece raditi:
char a[] = text;
Ali sta treba da napisem da bi ovo moglo da radi?

Ako me niste razumeli, koristeci string klasu "obicnog" C++ to bi izgledalo ovako:
string text = "neka poruka";
char a[] = text.c_str();

Dakle, meni treba takva konverzija( u niz char-ova) samo sto umesto string klase treba da bude String klasa( MC++ )...
[ NrmMyth @ 12.11.2006. 21:32 ] @
Pisano je u C++/CLI, ali sigurno ces se snaci.
Code:
string ConvertStringToStdString( System::String* s )
{
    System::IntPtr pp = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( s );
    string str( (const char*)pp.ToPointer() );
    System::Runtime::InteropServices::Marshal::FreeCoTaskMem( pp );
    return str;
};
[ Goran Arandjelovic @ 13.11.2006. 15:07 ] @
S tim sto mislim da bi ipak trebalo da pinuje taj String na hipu kako ranije pokazivac ne bi prso...:) Ili...u tom trenutku odmah moze da kopira string, jer je GC poseban thread i moze da 'obavi' premestanje u toku koriscenja interior pointera, ili se varam? :)
[ NrmMyth @ 13.11.2006. 15:26 ] @
Ne razumim te.
[ toxi_programer @ 13.11.2006. 18:45 ] @
@NrmMyth
da, snasao sam se.Doduse moram priznati da mi je nacin na koji ovo funkcionise stran :) Ali ima vremena, naucicu...
U svakom slucaju, hvala veliko! Pozdrav.
[ NrmMyth @ 13.11.2006. 20:02 ] @
Ukratko.
String koji boravi na GC (manged) heapu funkcijom StringToHGlobalAnsi() prebacis na nativni heap u raw ANSI formatu (C string, ako ti je ovako blize). Ona vraca pokazivac na taj niz.
Konstruktoru za std::string prosljedis taj char pointer i tim dobijes samostalni, recimo C++, string.
Na kraju oslobodis memoriju sa FreeCoTaskMem() koju je StringToHGlobalAnsi() zauzeo na nativnom heapu (moras se sam pobrinit za ovo, mozda cak i ne moras, ali moram poviriti u dokumentaciju).

Pozdrav.
[ Dragi Tata @ 13.11.2006. 20:11 ] @
Citat:
NrmMyth: Na kraju oslobodis memoriju sa FreeCoTaskMem() koju je StringToHGlobalAnsi() zauzeo na nativnom heapu (moras se sam pobrinit za ovo, mozda cak i ne moras, ali moram poviriti u dokumentaciju).


Moraš, ali ne FreeCoTaskMem, nego Marshal::FreeHGlobal

Inače, jedan tip je na Code Project-u napisao neku klasu za ovakva konvertovanja (C++/CLI), mada mi nije jasno šta će mu klasa, kad bi neke šablon funkcije tu bolje obavile posao, ali ajd sad.
[ NrmMyth @ 13.11.2006. 21:37 ] @
Citat:
Dragi Tata: Moraš, ali ne FreeCoTaskMem, nego Marshal::FreeHGlobal

Ne mogu vjerovati kako mi se ovo desilo... cudno... kao da sam bio corav...
Hvala na zapazanju. :)

Citat:
Inače, jedan tip je na Code Project-u napisao neku klasu za ovakva konvertovanja (C++/CLI), mada mi nije jasno šta će mu klasa, kad bi neke šablon funkcije tu bolje obavile posao, ali ajd sad.
Prvo sta mi padne na pamet je bolja kontrola memorijom s klasom. Moze cuvati memoriju koliko zeli i osloboditi je kako zeli i kad.