44 votes

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

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

74voto

Ben Straub Points 3224

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

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

Récupérer un personnage* est un peu plus difficile, mais pas trop mal :

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

18voto

Matthew Clendening Points 603

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

0voto

Dan Blair Points 1580

Ce qu'on a fait, c'est qu'on a fait un C++ \CLI qui contient la chaîne de caractères dans un code non modifié et qui distribue des copies gérées de l'objet. Le code de conversion ressemble beaucoup à celui que Stan a sur son blog (je ne me 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 s'occupe de libérer tous les éléments non modifiés de l'objet. C'est un peu exagéré, mais nous n'avons pas eu de fuites lorsque nous avons intégré des modules de code C++ hérités.

0voto

dko Points 143

J'ai créé quelques méthodes d'aide. J'avais besoin de faire cela pour passer d'une ancienne bibliothèque Qt à CLI String. Si quelqu'un peut ajouter quelque chose et me dire si j'ai l'impression d'avoir 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;
}

-1voto

Tadej Mali Points 150

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X