Каков одобренный способ конвертировать из char * в строку System:: и обратно в С++/CLI? Я нашел несколько ссылок на функции marshal_to < > templated в Google, но, похоже, эта функция никогда не делала срез для Visual Studio 2005 (а также не в Visual Studio 2008, AFAIK). Я также видел некоторый код в блоге Stan Lippman, но он с 2004 года. Я также видел маршала:: StringToHGlobalAnsi(). Есть ли метод, который считается "лучшей практикой"?
Каков наилучший способ преобразования между char * и System:: String в С++/CLI
Ответ 1
Здесь есть хороший обзор (эта поддержка маршалинга добавлена для VS2008): http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx
Ответ 2
System:: String имеет конструктор, который принимает char *:
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);
Ответ 3
Мы сделали объект С++\CLI, который содержал строку в незащищенном коде и выдавал управляемые копии элемента. Код конвертации очень похож на то, что Стэн имеет в своем блоге (я точно его не помню) (если вы используете его код, убедитесь, что вы его обновили, чтобы использовать delete []), но мы убедились, что деструктор будет обрабатывать все неосязаемые элементы объекта. Это немного раздуто, но у нас не было утечек, когда мы привязывались к устаревшим модулям кода С++.
Ответ 4
Я создал несколько вспомогательных методов. Мне нужно было сделать это, чтобы перейти от старой библиотеки Qt к CLI String. Если кто-то может добавить это и сказать мне, если мне кажется, что у меня есть утечка памяти и что я могу сделать, чтобы исправить это, я был бы очень благодарен.
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;
}
Ответ 5
Еще одна ссылка на краткое изложение возможных способов: