Convertire da System::String a Char in Visual C++
Questo articolo descrive diversi modi per eseguire la conversione da System::String*
a char*
usando estensioni gestite in Visual C++.
Versione originale del prodotto: Visual C++
Numero KB originale: 311259
Riepilogo
Questo articolo fa riferimento agli spazi dei nomi della libreria di classi di Microsoft .NET Framework seguenti:
System::Runtime::InteropServices
Msclr::interop
Questo articolo illustra diversi modi per eseguire la conversione da System::String*
a char*
usando quanto segue:
- Estensioni gestite per C++ in Visual C++ .NET 2002 e in Visual C++ .NET 2003
- C++/CLI in Visual C++ 2005 e in Visual C++ 2008
Metodo 1
PtrToStringChars
fornisce un puntatore interno all'oggetto effettivo String
. Se si passa questo puntatore a una chiamata di funzione non gestita, è necessario innanzitutto aggiungere il puntatore per assicurarsi che l'oggetto non si sposti durante un processo di Garbage Collection asincrono:
//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);
Metodo 2
StringToHGlobalAnsi
copia il contenuto di un oggetto gestito String
in heap nativo e quindi lo converte in formato ANSI (American National Standards Institute) al momento. Questo metodo alloca la memoria heap nativa necessaria:
//using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);
Nota
In Visual C++ 2005 e In Visual C++ 2008 è necessario aggiungere l'opzione del compilatore di supporto di Common Language Runtime (/clr:oldSyntax) per compilare correttamente l'esempio di codice precedente. Per aggiungere l'opzione del compilatore di supporto di Common Language Runtime, seguire questa procedura:
Fare clic su Progetto e quindi su Proprietà NomeProgetto.
Nota
ProjectName è un segnaposto per il nome del progetto.
Espandere Proprietà di configurazione e quindi fare clic su Generale.
Nel riquadro destro fare clic per selezionare Supporto di Common Language Runtime, Sintassi precedente (/clr:oldSyntax) nelle impostazioni del progetto di supporto di Common Language Runtime .
Fare clic su Applica e quindi su OK.
Per altre informazioni sulle opzioni del compilatore di supporto di Common Language Runtime, visitare il seguente sito Web Microsoft Developer Network (MSDN):
/clr (compilazione Common Language Runtime)
Questi passaggi si applicano all'intero articolo.
Metodo 3
La classe VC7 CString
ha un costruttore che accetta un puntatore string gestito e carica con il CString
relativo contenuto:
//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);
Metodo 4
Visual C++ 2008 introduce la marshal_as<T>
classe guida marshal e la marshal_context()
classe helper marshal.
//#include <msclr/marshal.h>
//using namespace msclr::interop;
marshal_context ^ context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(str);
puts(str4);
delete context;
Nota
Questo codice non viene compilato usando estensioni gestite per C++ in Visual C++ .NET 2002 o in Visual C++ .NET 2003. Usa la nuova sintassi C++/CLI introdotta in Visual C++ 2005 e il nuovo codice dello spazio dei nomi msclr introdotto in Visaul C++ 2008. Per compilare correttamente questo codice, è necessario usare l'opzione del compilatore /clr C++ in Visual C++ 2008.
Estensioni gestite per C++ codice di esempio (Visual C++ 2002 o Visual C++ 2003)
//compiler option: cl /clr
#include <vcclr.h>
#include <atlstr.h>
#include <stdio.h>
#using <mscorlib.dll>
using namespace System;
using namespace System::Runtime::InteropServices;
int _tmain(void)
{
System::String * str = S"Hello world\n";
//method 1
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);
//method 2
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);
//method 3
CString str3(str);
wprintf(str3);
return 0;
}
Codice di esempio C++/CLI (Visual C++ 2005 e Visual C++ 2008)
//compiler option: cl /clr
#include <atlstr.h>
#include <stdio.h>
#using <mscorlib.dll>
using namespace System;
using namespace System::Runtime::InteropServices;
#if _MSC_VER > 1499 // Visual C++ 2008 only
#include <msclr/marshal.h>
using namespace msclr::interop;
#endif
int _tmain(void)
{
System::String ^ str = "Hello world\n";
//method 1
pin_ptr<const wchar_t> str1 = PtrToStringChars(str);
wprintf(str1);
//method 2
char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();
printf(str2);
Marshal::FreeHGlobal((IntPtr)str2);
//method 3
CString str3(str);
wprintf(str3);
//method 4
#if _MSC_VER > 1499 // Visual C++ 2008 only
marshal_context ^ context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(str);
puts(str4);
delete context;
#endif
return 0;
}
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per