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

Dieser Artikel bezieht sich auf die folgenden Namespaces für Microsoft.NET Framework-Klassenbibliothek:
  • System::Runtime::InteropServices
  • Msclr::interop

Zusammenfassung

Dieser Artikel beschreibt verschiedene Arten von System:: String * Char * konvertieren wie folgt:
  • Managed Extensions for C++ in Microsoft Visual C++ .NET 2002 und Microsoft Visual C++ .NET 2003
  • C++ / CLI in Microsoft Visual C++ 2005 und Microsoft Visual C++ 2008

Methode 1

PtrToStringChars liefert einen inneren Zeiger auf das eigentliche Stringobjekt. Übergeben Sie diesen Zeiger einem nicht verwalteten Funktionsaufruf, müssen Sie zuerst den Mauszeiger, um sicherzustellen, dass das Objekt nicht während asynchroner Garbagecollectionvorgangs verschiebt fixieren:
//#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 Zeichenfolgenobjekts verwalteten systemeigenen Heap und wandelt es in American National Standards Institute (ANSI) Format dynamisch. Diese Methode reserviert den erforderlichen systemeigenen Heap-Speicher:
//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 Support Compileroption hinzufügen (/ CLR: oldSyntax) um den vorhergehenden Beispielcode kompilieren. Um die common Language Runtime Support Compileroption hinzuzufügen, gehen Sie folgendermaßen vor:

  1. Klicken Sie auf Projekt, und klicken Sie dann auf Eigenschaften von Projektname .



    Hinweis Projektname ist ein Platzhalter für den Namen des Projekts.
  2. Erweitern Sie Konfigurationseigenschaftenund dann auf Allgemein.

  3. Im rechten Bereich klicken Sie Common Language Runtime-Unterstützung, alte Syntax (/ CLR: oldSyntax) in der Common Language Runtime unterstützt project Settings.
  4. Klicken Sie auf Übernehmen, und klicken Sie dann auf OK.
Weitere Informationen über common Language Runtime-Unterstützung Compileroptionen finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:

Diese Schritte gelten für den gesamten Artikel.

Methode 3

Die VC7 CString -Klasse hat einen Konstruktor, der einen verwalteten Zeichenfolgenzeiger und den CString mit dessen Inhalt:
//#include <atlstr.h>System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);

Methode 4

Visual C++ 2008 führt Marshal_as < T > Marshal Help-Klasse und marshal_context() Marshal-Hilfsklasse.
//#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 ist nicht mit managed Extensions for C++ in Visual C++ .NET 2002 oder Visual C++ .NET 2003 kompiliert. Mithilfe der neuen C + / CLI-Syntax, die in Visual C++ 2005 und den neuen Msclr Namespace Code, der in Visual C++ 2008 eingeführt wurde eingeführt wurde. Um den Code erfolgreich zu kompilieren, verwenden Sie den Compilerschalter /clr/CLR C++ in Microsoft Visual C++ 2008.

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

Referenzen

Weitere Top-Treffer Visual C++ .NET Microsoft Knowledge Base-Artikel finden Sie auf der folgenden Microsoft-Website:
Eigenschaften

Artikelnummer: 311259 – Letzte Überarbeitung: 20.01.2017 – Revision: 2

Feedback