Каков наилучший способ преобразования между char* и System::String в C++/CLI?
Вопрос
Каков одобренный способ преобразования 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;
}
Еще одна ссылка на краткое изложение возможных способов: