Каков наилучший способ преобразования между char* и System::String в C++/CLI?

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

  •  09-06-2019
  •  | 
  •  

Вопрос

Каков одобренный способ преобразования char* в System::string и обратно в C++/CLI?Я нашел несколько ссылок на шаблонные функции marshal_to<> в Google, но похоже, что эта функция никогда не была включена в Visual Studio 2005 (и ее нет и в Visual Studio 2008, AFAIK).Я также видел некоторый код на Блог Стэна Липпмана, но это 2004 года.Я также видел Marshal::StringToHGlobalAnsi().Существует ли метод, который считается «лучшей практикой»?

Это было полезно?

Решение

Здесь есть хороший обзор (эта поддержка маршалинга добавлена ​​для VS2008):http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx

Другие советы

System::String имеет конструктор, принимающий символ*:

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

Вернуть char* немного сложнее, но не так уж плохо:

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

Мы создали объект C++\CLI, который содержал строку в неуправляемом коде и выдавал управляемые копии элемента.Код преобразования очень похож на тот, что есть у Стэна в его блоге (я точно его не помню) (если вы используете его код, обязательно обновите его, чтобы использовать delete[]), но мы позаботились о том, чтобы деструктор обработал освобождение всех неуправляемые элементы объекта.Это немного преувеличено, но у нас не было утечек, когда мы связывали устаревшие модули кода C++.

Я создал несколько вспомогательных методов.Мне нужно было сделать это, чтобы перейти от старой библиотеки Qt к строке CLI.Если кто-нибудь может добавить к этому и сказать мне, кажется ли мне, что у меня есть утечка памяти и что я могу сделать, чтобы это исправить, я был бы очень признателен.

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;
}

Еще одна ссылка на краткое изложение возможных способов:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top