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:

  1. Fare clic su Progetto e quindi su Proprietà NomeProgetto.

    Nota

    ProjectName è un segnaposto per il nome del progetto.

  2. Espandere Proprietà di configurazione e quindi fare clic su Generale.

  3. 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 .

  4. 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;
}