¿Cuál es la forma aprobada para convertir de char * a System :: string y viceversa en C++/CLI? Encontré algunas referencias a marshal_to <> funciones con plantilla 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 un código en Stan Lippman's blog, pero es de 2004. También he visto Marshal :: StringToHGlobalAnsi(). ¿Hay algún método que se considere "mejor práctica"?¿Cuál es la mejor forma de convertir entre char * y System :: String en C++/CLI
Respuesta
Hay una buena visión general aquí (este apoyo cálculo de referencias añadido para VS2008): http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx
Lo que hicimos se hizo un objeto C++ \ CLI que mantuvo la cadena en código no manipulado y daría copias administradas del elemento. 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++.
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 * de vuelta 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);
+1, el constructor System :: String también toma longitud y codificación. –
'Marshal :: StringToHGlobalAnsi' es una opción pobre en comparación con' marshal_context' (como lo menciona Matthew), que utiliza RAII para liberar automáticamente el búfer. Sin mencionar que el nombre es totalmente incorrecto, no devuelve un 'HGLOBAL' en absoluto. –
He creado 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;
}
Probablemente tenga que Marshal :: FreeHGlobal (IntPtr ((void *) caracteres)); es –
@Pat sí, lo siento, debería haberlo actualizado después de esto. Lo hice funcionar bien ahora. Moverlo a .NET aumentó el rendimiento de esta aplicación en 3x. Incluso clasificando cosas alrededor. – dko
un enlace adicional a un resumen de las posibles maneras:
- 1. ¿Cuál es la mejor forma de convertir enum a string?
- 2. ¿La mejor manera de convertir entre [Char] y [Word8]?
- 3. Cómo convertir System :: String^en std :: string?
- 4. Conversión de System :: String a Const Char *
- 5. ¿Cuál es la diferencia entre Double.parseDouble (String) y Double.valueOf (String)?
- 6. Diferencia entre char * str = "STRING" y char str [] = "STRING"?
- 7. ¿Cuál es la mejor forma de convertir ByteString en Int?
- 8. Convierta un 'System :: String ^' en 'const char *' en vC++
- 9. Necesita convertir String^en char *
- 10. ¿cuál es la diferencia entre/system/app y/data/app?
- 11. ¿Cómo convierto un System :: String^a const char *?
- 12. ¿Cuál es la mejor forma de convertir una cadena separada por caracteres de retorno en una lista <string>?
- 13. Cómo convertir char * a un sistema :: string^
- 14. Cómo convertir std :: string a const char *?
- 15. ¿Cuál es la forma más sencilla de convertir char [] a/de tchar [] en C/C++ (ms)?
- 16. String.Replace (char, char) o Replace (string, string)?
- 17. ¿Cuál es la mejor forma de convertir TBytes (UTF-16) en una cadena?
- 18. ¿Cuál es la diferencia entre string y StringBuilder?
- 19. ¿Cuál es la diferencia entre CharSequence [] y un String []?
- 20. ¿Cuál es la mejor forma de conectarse entre la base de datos android y oracle?
- 21. stringstream, string y char * confusión de conversión
- 22. Cómo convertir Platform :: String a char *?
- 23. ¿Cuál es la mejor forma de distribuir Lua y bibliotecas?
- 24. Cuál es la diferencia entre el nuevo char [10] y el nuevo char (10)
- 25. Mejor forma de obtener Char Enum
- 26. Objetivo C: ¿Cuál es la mejor forma de convertir volátiles en Java en Objective C?
- 27. ¿Cuál es la mejor forma de comunicarse entre un servicio WCF y subprocesos separados?
- 28. ¿Cuál es la mejor forma de convertir el diseño de la tabla al diseño de CSS?
- 29. .NET System :: Cadena a UTF8-bytes almacenada en char *
- 30. ¿Cuál es la diferencia entre {0} y ""?
Gracias, pero eso es una larga explicación. Esto va más al grano: '#include // marshal_context context; // my_c_string = context.marshal_as (my_csharp_string); ' –
gatopeich
Para aquellos que se preguntan, el espacio de nombre completo para el contexto es' msclr :: interop :: marshal_context' – Mugen