Was ist der beste Weg, um die Konvertierung zwischen char* und System::String in C++/CLI

StackOverflow https://stackoverflow.com/questions/56561

  •  09-06-2019
  •  | 
  •  

Frage

Was ist die genehmigte Methode zum konvertieren von char* System::string und zurück in C++/CLI?Ich fand ein paar Verweise auf marshal_to<> Vorlagen-Funktionen auf Google, aber es scheint, dass diese Funktion nie den Schnitt für Visual Studio 2005 (und nicht in Visual Studio 2008 entweder, AFAIK).Ich habe auch gesehen, einige code auf Stan Lippman s blog,, aber es ist aus 2004.Ich habe auch gesehen, Marshal::StringToHGlobalAnsi().Gibt es eine Methode, die als "best-practice"?

War es hilfreich?

Lösung

Es gibt einen guten Überblick hier (die Serialisieren Unterstützung für VS2008 hinzugefügt): http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx

Andere Tipps

System :: String hat einen Konstruktor, der ein Zeichen nimmt *:

 using namespace system;
 const char* charstr = "Hello, world!";
 String^ clistr = gcnew String(charstr);
 Console::WriteLine(clistr);

Wie Sie einen char * zurück ist ein bisschen schwieriger, aber auch nicht schlecht:

 IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
 char *pNewCharStr = static_cast<char*>(p.ToPointer());
 cout << pNewCharStr << endl;
 Marshal::FreeHGlobal(p);

Was wir getan haben ist ein C ++ \ CLI-Objekt vorgenommen, die die Zeichenfolge in unmangaed Code gehalten und würde manged Kopien des Elements geben. Die Conversion-Code sieht sehr ähnlich wie das, was Stan hat auf seinem Blog (Ich kann mich nicht erinnern, es genau) (Wenn Sie den Code verwenden, stellen Sie sicher, es aktualisieren [] verwenden, löschen), aber wir darauf geachtet, dass die destructor alle Freigabe behandeln würde unmanged die Elemente des Gegenstandes. Dies ist ein wenig übertrieben, aber wir haben nicht Lecks haben, wenn wir in bestehende C ++ Code-Module gebunden.

Ich habe ein paar Hilfsmethoden. Ich brauchte, dies zu tun aus einer alten Qt-Bibliothek zu CLI String zu bewegen. Wenn jemand auf diese hinzufügen und mir sagen, ob es scheint, als ob ich ein Speicherleck haben und was ich es zu beheben tun kann, wäre ich sehr dankbar sein.

void MarshalString (  String ^ s, wstring& os ) {
    using namespace Runtime::InteropServices;
    const wchar_t* char = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
    os = char;
}
QString SystemStringToQt( System::String^ str)
{
    wstring t;
    MarshalString(str, t);
    QString r = QString::fromUcs2((const ushort*)t.c_str());
    return r;
}

Ein weiterer Link zu einer Zusammenfassung der Möglichkeiten:

http://support.microsoft.com/?kbid=311259

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top