¿Cuál es la mejor manera para convertir entre char* y Sistema de::String en C++/CLI

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

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Cuál es la forma aprobada para convertir char* Sistema::string, y de nuevo en C++/CLI?He encontrado algunas referencias a marshal_to<> funciones con plantillas en Google, pero parece que esta característica nunca se hizo el corte para Visual Studio 2005 (y lo que no en Visual Studio 2008 o bien, AFAIK).También he visto algo de código en Stan Lippman del blog, pero es a partir de 2004.También he visto Mariscal::StringToHGlobalAnsi().Hay un método que se considera la "mejor práctica"?

¿Fue útil?

Solución

Hay un buen resumen aquí (este cálculo de referencias se ha añadido soporte para VS2008):http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx

Otros consejos

Sistema::String tiene un constructor que toma un char*:

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

Conseguir un char* parte trasera es un poco más difícil, pero no demasiado malo:

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

Lo que hemos hecho es hecho con C++\CLI objeto que sostenía la cadena en unmangaed código y daría manejadas copias del elemento.El código de conversión que se parece mucho a lo que Stan tiene en su blog (no recuerdo exactamente)(Si usted utiliza su código asegúrese de actualizar a utilizar delete[]) pero nos aseguramos de que el destructor se encargan de manejar la liberación de todos los unmanged los elementos del objeto.Esto es un poco exagerada, pero no teníamos fugas cuando nos acercamos al legado de C++ módulos de código.

He creado un par de métodos auxiliares.Necesitaba hacer esto para pasar de una vieja biblioteca Qt a CLI Cadena.Si alguien puede añadir a este y me dicen que si me parece que tiene una pérdida de memoria y de lo que puedo hacer para solucionarlo, le estaría muy agradecida.

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 enlace a un resumen de las posibles formas:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top