Konvertieren von "System::String" in "Char" in Visual C++
In diesem Artikel werden mehrere Möglichkeiten zum Konvertieren von System::String* char* in mithilfe verwalteter Erweiterungen in Visual C++ beschrieben.
Originalversion des Produkts: Visual C++
Ursprüngliche KB-Nummer: 311259
Zusammenfassung
Dieser Artikel bezieht sich auf die folgenden Namespaces der Microsoft .NET Framework-Klassenbibliothek:
System::Runtime::InteropServicesMsclr::interop
In diesem Artikel werden verschiedene Möglichkeiten für die Konvertierung System::String* char* mithilfe der folgenden 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 Visual C++ 2008
Methode 1
PtrToStringChars gibt Ihnen einen Innenzeiger auf das tatsächliche 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 einen nativen Heap und konvertiert ihn dann sofort in das 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);
Hinweis
In Visual C++ 2005 und Visual C++ 2008 müssen Sie die Common Language Runtime-Compileroption (/clr:oldSyntax) hinzufügen, um das vorherige Codebeispiel erfolgreich kompilieren zu können. Führen Sie die folgenden Schritte aus, um die Common Language Runtime-Unterstützungscompileroption hinzuzufügen:
Klicken Sie auf Project und dann auf ProjectName-Eigenschaften.
Hinweis
ProjectName ist ein Platzhalter für den Namen des Projekts.
Erweitern Sie die Konfigurationseigenschaften, und klicken Sie dann auf "Allgemein".
Klicken Sie im rechten Bereich auf die Option " Common Language Runtime Support, Old Syntax (/clr:oldSyntax)" in den Projekteinstellungen für die Common Language Runtime-Unterstützung .
Klicken Sie im Feld Wähleinstellungen (Telefonkontext) auf Durchsuchen, um die Wähleinstellungen für den Benutzer zu suchen.
Weitere Informationen zu Compileroptionen für allgemeine Sprachlaufzeiten finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:
/clr (Common Language Runtime Compilation)
Diese Schritte gelten für den gesamten Artikel.
Methode 3
Die VC7-Klasse CString verfügt über einen Konstruktor, der einen verwalteten String-Zeiger verwendet und den CString mit seinem 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-Hilfeklasse und die marshal_context() Marshal-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 mit verwalteten 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 kompilieren zu können, müssen Sie den Compilerschalter /clr C++ 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;
}