Quelle est la meilleure façon de convertir entre char* et System::String en C++/CLI

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

  •  09-06-2019
  •  | 
  •  

Question

Quelle est la manière approuvée de convertir de char* en System::string et inversement en C++/CLI ?J'ai trouvé quelques références aux fonctions basées sur un modèle marshal_to<> sur Google, mais il semble que cette fonctionnalité n'ait jamais été retenue pour Visual Studio 2005 (et ne soit pas non plus dans Visual Studio 2008, AFAIK).J'ai aussi vu du code sur Le blog de Stan Lippman, mais ça date de 2004.J'ai également vu Marshal::StringToHGlobalAnsi().Existe-t-il une méthode considérée comme « meilleure pratique » ?

Était-ce utile?

La solution

Il y a un bon aperçu ici (cette prise en charge du marshaling ajoutée pour VS2008) :http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx

Autres conseils

System::String a un constructeur qui prend un char* :

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

Récupérer un char* est un peu plus difficile, mais pas trop grave :

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

Ce que nous avons fait, c'est créer un objet C++\CLI contenant la chaîne dans du code non géré et qui distribuerait des copies gérées de l'élément.Le code de conversion ressemble beaucoup à ce que Stan a sur son blog (je ne m'en souviens pas exactement) (Si vous utilisez son code, assurez-vous de le mettre à jour pour utiliser delete[]) mais nous nous sommes assurés que le destructeur se chargerait de tout libérer. les éléments non gérés de l'objet.C'est un peu exagéré, mais nous n'avons pas eu de fuites lorsque nous avons intégré les anciens modules de code C++.

J'ai créé quelques méthodes d'assistance.Je devais faire cela pour passer d'une ancienne bibliothèque Qt à CLI String.Si quelqu'un peut ajouter quelque chose et me dire s'il semble que j'ai une fuite de mémoire et ce que je peux faire pour y remédier, je lui en serais très reconnaissant.

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

Un lien supplémentaire vers un résumé des moyens possibles :

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top