Pergunta

Qual é a maneira aprovada de converter de char* para System::string e vice-versa em C++/CLI?Encontrei algumas referências às funções de modelo marshal_to<> no Google, mas parece que esse recurso nunca foi adequado para o Visual Studio 2005 (e também não está no Visual Studio 2008, AFAIK).Eu também vi algum código em Blog de Stan Lippman, mas é de 2004.Também vi Marshal::StringToHGlobalAnsi().Existe um método considerado “melhor prática”?

Foi útil?

Solução

Há uma boa visão geral aqui (este suporte de empacotamento adicionado para VS2008):http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx

Outras dicas

System::String tem um construtor que recebe um char*:

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

Recuperar um char* é um pouco mais difícil, mas não tão ruim:

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

O que fizemos foi criar um objeto C++\CLI que continha a string em código não gerenciado e distribuía cópias gerenciadas do item.O código de conversão se parece muito com o que Stan tem em seu blog (não me lembro exatamente) (se você usar o código dele, certifique-se de atualizá-lo para usar delete[]), mas garantimos que o destruidor cuidaria da liberação de todos os elementos não gerenciados do objeto.Isso é um pouco exagerado, mas não tivemos vazamentos quando vinculamos módulos de código C++ legados.

Eu criei alguns métodos auxiliares.Eu precisava fazer isso para passar de uma biblioteca Qt antiga para CLI String.Se alguém puder acrescentar isso e me dizer se parece que tenho um vazamento de memória e o que posso fazer para corrigi-lo, eu ficaria muito 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;
}

Um link adicional para um resumo das formas possíveis:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top