在C ++ / CLI中转换char *和System :: String的最佳方法是什么

时间:2008-09-11 13:45:31

标签: .net string c++-cli

从char *转换为System :: string并返回C ++ / CLI的批准方法是什么?我找到了一些marshal_to<>的引用谷歌的模板化功能,但似乎这个功能从未削减过Visual Studio 2005(并且在Visual Studio 2008中也没有,AFAIK)。我还在Stan Lippman's blog上看到了一些代码,但它是从2004年开始的。我还看过Marshal :: StringToHGlobalAnsi()。有没有一种方法被认为是“最佳实践”?

5 个答案:

答案 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)

指向可能方式摘要的另一个链接:

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