System::String转换为std::string

来源:互联网 发布:决胜60秒源码 编辑:程序博客网 时间:2024/05/21 22:46


此文为转载文章

作者:Kyle的博客

连接:http://blog.sina.com.cn/s/blog_695abcf70100m6ac.html


    当使用C++/CLI包装C++本地代码时,常常需要将System::String转换为std::string或者char*以调用native C++函数。.net环境中的字符串是unicode的,占2个字节,而很多native C++函数都没有考虑unicode,这种转换不仅仅是2字节转1字节,同时也涉及到字符集的转换。

    在有些文档中提到用wcstombs进行宽字符到多字符的转换,但是经过试验,这种方式在C++/CLI代码中处理中文时会失败。在System::Runtime::InteropServices名字空间里的Marshal类提供了另外一种方式(StringToHGlobalAnsi)进行这种转换,msdn中说道:“将托管 String 中的内容复制到非托管内存,并在复制时转换为 ANSI 格式。StringToHGlobalAnsi 对于自定义封送处理或者在混合托管和非托管代码时很有用。由于该方法分配字符串所需的非托管内存,因此应始终通过调用 FreeHGlobal 释放内存。StringToHGlobalAnsi 提供与 Marshal.PtrToStringAnsi 相反的功能。”

void ConvertToString(System::String^ str, std::string& text)
{
     char* p = (char*)(int)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str);
     text = p;
     System::Runtime::InteropServices::Marshal::FreeHGlobal((System::IntPtr)p);
}

0 0
原创粉丝点击