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" ?
Réponses
Trop de publicités?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);
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
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.
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;
}