Каков наилучший способ преобразования между char * и System :: String в C ++ / CLI - PullRequest
41 голосов
/ 11 сентября 2008

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

Ответы [ 5 ]

73 голосов
/ 11 сентября 2008

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

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

Получить чарса * немного сложнее, но не так уж и плохо:

 IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
 char *pNewCharStr = static_cast<char*>(p.ToPointer());
 cout << pNewCharStr << endl;
 Marshal::FreeHGlobal(p);
17 голосов
/ 11 сентября 2008

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

0 голосов
/ 25 мая 2013

Одна дополнительная ссылка на краткое изложение возможных путей:

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

0 голосов
/ 01 июня 2011

Я создал несколько вспомогательных методов. Мне нужно было сделать это, чтобы перейти от старой библиотеки 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;
}
0 голосов
/ 11 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...