从char *转换为System :: string并返回C ++ / CLI的批准方法是什么?我找到了一些marshal_to<>的引用谷歌的模板化功能,但似乎这个功能从未削减过Visual Studio 2005(并且在Visual Studio 2008中也没有,AFAIK)。我还在Stan Lippman's blog上看到了一些代码,但它是从2004年开始的。我还看过Marshal :: StringToHGlobalAnsi()。有没有一种方法被认为是“最佳实践”?
答案 0 :(得分:73)
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);
答案 1 :(得分:17)
这里有一个很好的概述(为VS2008添加了这个编组支持): http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx
答案 2 :(得分:0)
我们所做的是制作了一个C ++ \ CLI对象,该对象将字符串保存在未编码的代码中,并且会给出该项目的manged副本。转换代码看起来非常像Stan在他的博客上(我完全不记得)(如果你使用他的代码确保你更新它以使用delete [])但我们确保析构函数将处理释放所有对象的无人值守元素。这有点过分了,但是当我们绑定到传统的C ++代码模块时,我们没有泄漏。
答案 3 :(得分:0)
我创建了一些辅助方法。我需要这样做才能从旧的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;
}
答案 4 :(得分:-1)
指向可能方式摘要的另一个链接: