Konvertieren von System::String in Char in Visual C++

In diesem Artikel werden verschiedene Möglichkeiten zum Konvertieren von System::String*char* in mithilfe verwalteter Erweiterungen in Visual C++ beschrieben.

Ursprüngliche Produktversion: Visual C++
Ursprüngliche KB-Nummer: 311259

Zusammenfassung

Dieser Artikel bezieht sich auf die folgenden Namespaces der Microsoft .NET Framework-Klassenbibliothek:

  • System::Runtime::InteropServices
  • Msclr::interop

In diesem Artikel werden verschiedene Möglichkeiten zum Konvertieren von in System::String*char* mithilfe der folgenden Methoden erläutert:

  • Verwaltete Erweiterungen für C++ in Visual C++ .NET 2002 und Visual C++ .NET 2003
  • C++/CLI in Visual C++ 2005 und Visual C++ 2008

Methode 1

PtrToStringChars gibt Ihnen einen inneren Zeiger auf das eigentliche String Objekt. Wenn Sie diesen Zeiger an einen nicht verwalteten Funktionsaufruf übergeben, müssen Sie zuerst den Zeiger anheften, um sicherzustellen, dass das Objekt während eines asynchronen Garbage Collection-Prozesses nicht verschoben wird:

//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);

Methode 2

StringToHGlobalAnsi kopiert den Inhalt eines verwalteten String Objekts in den nativen Heap und konvertiert ihn dann im AnSI-Format (American National Standards Institute). Diese Methode ordnet den erforderlichen nativen Heapspeicher zu:

//using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);

Hinweis

In Visual C++ 2005 und Visual C++ 2008 müssen Sie die Common Language Runtime-Unterstützungscompileroption (/clr:oldSyntax) hinzufügen, um das vorherige Codebeispiel erfolgreich zu kompilieren. Führen Sie die folgenden Schritte aus, um die Common Language Runtime-Unterstützungscompileroption hinzuzufügen:

  1. Klicken Sie auf Projekt und dann auf ProjektName-Eigenschaften.

    Hinweis

    ProjectName ist ein Platzhalter für den Namen des Projekts.

  2. Erweitern Sie Konfigurationseigenschaften, und klicken Sie dann auf Allgemein.

  3. Klicken Sie im rechten Bereich, um Common Language Runtime-Unterstützung, alte Syntax (/clr:oldSyntax) in den Common Language Runtime-Supportprojekteinstellungen auszuwählen.

  4. Klicken Sie im Feld Wähleinstellungen (Telefonkontext) auf Durchsuchen, um die Wähleinstellungen für den Benutzer zu suchen.

Weitere Informationen zur Common Language Runtime-Unterstützung für Compileroptionen finden Sie auf der folgenden Msdn-Website (Microsoft Developer Network):

/clr (Common Language Runtime-Kompilierung)

Diese Schritte gelten für den gesamten Artikel.

Methode 3

Die VC7-Klasse CString verfügt über einen Konstruktor, der einen verwalteten Zeichenfolgenzeiger annimmt und den mit seinem CString Inhalt lädt:

//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);

Methode 4

Visual C++ 2008 führt die marshal_as<T> Marshall-Hilfeklasse und die marshal_context() Marshall-Hilfsklasse ein.

//#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;

Hinweis

Dieser Code wird nicht mithilfe verwalteter Erweiterungen für C++ in Visual C++ .NET 2002 oder Visual C++ .NET 2003 kompiliert. Es verwendet die neue C++/CLI-Syntax, die in Visual C++ 2005 eingeführt wurde, und den neuen msclr-Namespacecode, der in Visaul C++ 2008 eingeführt wurde. Um diesen Code erfolgreich zu kompilieren, müssen Sie den C++-Compilerschalter /clr in Visual C++ 2008 verwenden.

Managed Extensions for C++ Beispielcode (Visual C++ 2002 oder 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;
}

C++/CLI-Beispielcode (Visual C++ 2005 und 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;
}