我正在尝试将句柄字符串转换为普通字符串。我虽然我使用的方法正在工作,但是当我查看调试器时,看起来我的字符串的一半已经在创建chars变量的行上被切断了。知道为什么以及将句柄字符串转换为普通字符串的正确方法是什么?
std::string convert(String^ s) {
const char* chars = (const char*)(System::Runtime::InteropServices::Marshal::
StringToHGlobalAnsi(s)).ToPointer();
string myNewString = std::string(chars);
return myNewString;
}
答案 0 :(得分:1)
可能是调试器切断了字符串的显示。你没有提到你使用的字符串有多长,但是调试器无法显示无限长度,所以它必须在某个时刻将其剪掉。
要验证这一点,请尝试将myNewString
打印到控制台,或通过Debug::WriteLine
或OutputDebugString
打印到调试器。
但是,您的代码中存在一个重大问题:使用StringToHGlobalAnsi
分配内存后,必须使用FreeHGlobal
释放内存。
如果您想继续使用StringToHGlobalAnsi
,请按以下方式修复:
std::string convert(String^ s) {
IntPtr ptr = Marshal::StringToHGlobalAnsi(s);
string myNewString = std::string((const char*)ptr.ToPointer());
Marshal::FreeHGlobal(ptr);
return myNewString;
}
但是,使用marshal_as
方法可能更容易。这将为您处理一切。
std::string output = marshal_as<std::string>(managedString);