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:
Klicken Sie auf Projekt und dann auf ProjektName-Eigenschaften.
Hinweis
ProjectName ist ein Platzhalter für den Namen des Projekts.
Erweitern Sie Konfigurationseigenschaften, und klicken Sie dann auf Allgemein.
Klicken Sie im rechten Bereich, um Common Language Runtime-Unterstützung, alte Syntax (/clr:oldSyntax) in den Common Language Runtime-Supportprojekteinstellungen auszuwählen.
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;
}
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für