.net - extraer - Cuál es la mejor forma de convertir entre char*y System:: String en C++/CLI
string c# ejemplos (5)
¿Cuál es la forma aprobada para convertir de char * a System :: string y viceversa en C ++ / CLI? Encontré algunas referencias a las funciones marshal_to <> templated en Google, pero parece que esta característica nunca hizo el corte para Visual Studio 2005 (y tampoco está en Visual Studio 2008, AFAIK). También he visto algunos códigos en el blog de Stan Lippman , pero es del 2004. También he visto a Marshal :: StringToHGlobalAnsi (). ¿Hay algún método que se considere "mejor práctica"?
Aquí hay una buena visión general (este soporte de clasificación se agregó para VS2008): http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx
Creé algunos métodos de ayuda. Necesitaba hacer esto para pasar de una antigua biblioteca de Qt a CLI String. Si alguien puede agregar algo sobre esto y decirme si parece que tengo una pérdida de memoria y qué puedo hacer para solucionarlo, lo agradecería mucho.
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;
}
Lo que hicimos fue un objeto C ++ / CLI que contenía la cadena en código no manipulado y entregaba copias administradas del ítem. El código de conversión se parece mucho a lo que Stan tiene en su blog (no lo recuerdo exactamente) (Si usa su código, asegúrese de actualizarlo para usar delete []), pero nos aseguramos de que el destructor maneje la liberación de todo los elementos no manejados del objeto. Esto es un poco exagerado, pero no tuvimos filtraciones cuando nos relacionamos con los módulos de código heredados de C ++.
System :: String tiene un constructor que toma un char *:
using namespace system;
const char* charstr = "Hello, world!";
String^ clistr = gcnew String(charstr);
Console::WriteLine(clistr);
Recuperar un char * es un poco más difícil, pero no está mal:
IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
char *pNewCharStr = static_cast<char*>(p.ToPointer());
cout << pNewCharStr << endl;
Marshal::FreeHGlobal(p);
Un enlace adicional a un resumen de posibles formas: