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"?

È stato utile?

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à:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top