在C ++ / CLI中转换char *和System :: String的最佳方式是什么?
什么是批准的方式从char *转换为System :: string并返回到C ++ / CLI? 我在Google上find了一些对marshal_to <>模板化函数的引用,但是这个function似乎从来没有为Visual Studio 2005做过裁剪(也不在Visual Studio 2008中,AFAIK)。 我也在Stan Lippman的博客上看过一些代码,但是从2004年开始。我还看到了Marshal :: StringToHGlobalAnsi()。 有没有一种被认为是“最佳实践”的方法?
这里有一个很好的概述(VS2008添加了这个封送处理支持): http : //www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx
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);
我们所做的是制作了一个C ++ \ CLI对象,该对象将该string保存在未加载的代码中,并且会发出该对象的pipe理副本。 转换代码看起来非常像Stan在他的博客上(我不记得它确切)(如果你使用他的代码确保你更新它使用delete []),但我们确保析构函数将处理释放所有对象的无形元素。 这是有点夸张,但是当我们绑定到传统的C ++代码模块时,我们没有泄漏。
我创build了一些辅助方法。 我需要做这个从旧的Qt库到CLIstring。 如果任何人可以添加到这个,告诉我,如果我有一个内存泄漏,我可以做什么来解决它,我会最感激。
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; }
对可能的方式进行总结的另一个链接是: