Qual è il modo migliore per convertire tra char* e System::String in C++/CLI
Domanda
Qual è il modo approvato per convertire da char* a System::string e viceversa in C++/CLI?Ho trovato alcuni riferimenti alle funzioni basate su modelli marshal_to<> su Google, ma sembra che questa funzionalità non sia mai stata tagliata per Visual Studio 2005 (e non è nemmeno in Visual Studio 2008, per quanto ne so).Ho anche visto del codice su Il blog di Stan Lippman, ma è del 2004.Ho anche visto Marshal::StringToHGlobalAnsi().Esiste un metodo considerato "migliore pratica"?
Soluzione
C'è una buona panoramica qui (questo supporto per il marshalling è stato aggiunto per VS2008):http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx
Altri suggerimenti
System::String ha un costruttore che accetta un carattere*:
using namespace system;
const char* charstr = "Hello, world!";
String^ clistr = gcnew String(charstr);
Console::WriteLine(clistr);
Recuperare un personaggio* è un po' più difficile, ma non poi così male:
IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
char *pNewCharStr = static_cast<char*>(p.ToPointer());
cout << pNewCharStr << endl;
Marshal::FreeHGlobal(p);
Ciò che abbiamo fatto è stato creare un oggetto C++\CLI che contenesse la stringa in codice non gestito e fornisse copie gestite dell'elemento.Il codice di conversione assomiglia molto a quello che Stan ha sul suo blog (non riesco a ricordarlo esattamente) (Se usi il suo codice assicurati di aggiornarlo per usare delete[]) ma ci siamo assicurati che il distruttore gestisse il rilascio di tutto gli elementi non gestiti dell'oggetto.Questo è un po' esagerato, ma non abbiamo avuto perdite di informazioni quando ci siamo collegati ai moduli di codice C++ legacy.
Ho creato alcuni metodi di supporto.Avevo bisogno di farlo per passare da una vecchia libreria Qt a CLI String.Se qualcuno può aggiungere qualcosa a questo e dirmi se sembra che io abbia una perdita di memoria e cosa posso fare per risolverlo, gli sarei molto grato.
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 collegamento aggiuntivo a un riepilogo delle possibili modalità: