Freigeben über


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

In diesem Artikel werden verschiedene Möglichkeiten beschrieben, wie Sie mithilfe von verwalteten Erweiterungen in Visual C++ von System::String* zu char* konvertieren.

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

Zusammenfassung

Dieser Artikel bezieht sich auf die folgenden Microsoft .NET Framework-Klassenbibliotheksnamespaces:

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

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

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

Methode 1

PtrToStringChars gibt Ihnen einen Innenzeiger 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 systemeigenen Heap und konvertiert es dann im AnSI-Format (American National Standards Institute). Diese Methode weist den erforderlichen systemeigenen 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);

Notiz

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

  1. Klicken Sie auf "Projekt" und dann auf "ProjectName-Eigenschaften".

    Notiz

    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 die Unterstützung von Common Language Runtime, Old Syntax (/clr:oldSyntax) in den Common Language Runtime-Supportprojekteinstellungen auszuwählen.

  4. Klicken Sie auf Übernehmen und anschließend auf OK.

Weitere Informationen zur Unterstützung von Compileroptionen für common language runtime 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 verwendet und den 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> Marshal Help-Klasse und die marshal_context() Marshal Helper-Klasse 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;

Notiz

Dieser Code wird nicht kompiliert, indem verwaltete Erweiterungen für C++ in Visual C++ .NET 2002 oder in Visual C++ .NET 2003 verwendet werden. 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 kompilieren zu können, müssen Sie den Compilerschalter "/clr C++" in Visual C++ 2008 verwenden.

Verwaltete Erweiterungen für 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;
}