本文共 814 字,大约阅读时间需要 2 分钟。
此文为转载文章
作者:
连接: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); }