Italiano - English

Conversione da String^ a char* o LPCWSTR con C++/CLI

Un tecnica di conversione del tipo C++/CLI String^ nel comune char *.

Ottenere questa conversione non è una operazione immediata. La funzioni  StringToHGlobalUni, StringToHGlobalAnsi, StringToHGlobalUni, possono essere utilizzate allo scopo.

StringToHGlobalAnsi copies the contents of a managed String object into native heap, and then converts it into American National Standards Institute (ANSI) format on the fly. This method allocates the required native heap memory.

Questa funzione alloca la memoria necessaria e copia il contenuto di una System::String^ in un buffer nella memoria heap. La copia, quindi la quantità di byte allocati, avviene utilizzando il formato richiesto (ANSI o UNICODE) quindi è necessario utilizzare il cast appropriato per la lettura della stringa.

La versione da utilizzare dipende dal formato con cui è impostato il proprio ambiente di sviluppo, oppure da tipo di variabile che si vuole in uscita. Solitamente Visual Studio è configurato con UNICODE, quindi utilizzare la versione relativa.

La versione AUTO seleziona automaticamente il tipo di formattazione

Quindi si procede in questo modo:

    char * a;
    String ^ str = "Pk Lab dot net";

    // (Marshalling)Conversione del tipo String a char *
    // Viene allocata memoria non gestita per contenere la stringa 
    a =  (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str);
     // Utilizzo della variabile char *
    printf(a);
     // Libero la memoria allocata per la stringa
     // La variabile 'a' non è piu' valida
    System::Runtime::InteropServices::Marshal::FreeHGlobal((System::IntPtr)(void*)a);

Allo stesso modo è possibile convertire da System::String^ a LPCWSTR

    LPCWSTR astring;
    System::String ^ str = "Pk Lab dot net";

    IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalUni(str);
    astring = (LPCWSTR)ptr.ToPointer();

    ... utilizzare la variabile 'astring'
    
     // Libero la memoria allocata per la stringa
     // Ora la variabile 'astring' non è più valida
    System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr)

Vengono suggeriti anche altri metodi che usano PtrToStringChars o la classe CString.

Vedi anche:

 

Vota questa pagina:

0 Commenti:

Lascia il tuo commento:

Note:
  • La tua email non è obligatoria e non sarà visibile in alcun modo
  • Si prega di inviare solo commenti relativi a questa pagina
  • Commenti inappropriati o offensivi saranno modificati o eliminati
  • Codici HTML non sono consentiti. Prego usare i BB code:
    [b]bold[/b], [u]underline[/u], [i]italic[/i], [code]code[/code]
Il codice, le illustrazioni e gli esempi riportati in questa pagina sono solo a scopo illustrativo. L'autore non prende alcuna responsabilità per il loro utilizzo da parte dell'utente finale.
Questo materiale è di proprietà di Pk Lab ed è utilizzabile liberamente a condizione di citarne la fonte.