目标是避免在需要时复制字符串数据const wchar_t*
。
答案似乎是肯定的,但该函数PtrToStringChars
没有自己的 MSDN 条目(仅在 KB 和博客中作为技巧提及)。这让我很怀疑,我想和你们核实一下。使用该功能是否安全?
目标是避免在需要时复制字符串数据const wchar_t*
。
答案似乎是肯定的,但该函数PtrToStringChars
没有自己的 MSDN 条目(仅在 KB 和博客中作为技巧提及)。这让我很怀疑,我想和你们核实一下。使用该功能是否安全?
这是一个基于 PtrToStringChars 的完整解决方案,它访问托管字符串内部,然后使用标准 C 函数复制内容:
wchar_t *ManagedStringToUnicodeString(String ^s)
{
// Declare
wchar_t *ReturnString = nullptr;
long len = s->Length;
// Check length
if(len == 0) return nullptr;
// Pin the string
pin_ptr<const wchar_t> PinnedString = PtrToStringChars(s);
// Copy to new string
ReturnString = (wchar_t *)malloc((len+1)*sizeof(wchar_t));
if(ReturnString)
{
wcsncpy(ReturnString, (wchar_t *)PinnedString, len+1);
}
// Unpin
PinnedString = nullptr;
// Return
return ReturnString;
}
是没有问题。它实际上有一些记录,但很难找到。C++ 库的 MSDN 文档不是很好。它返回一个内部指针,目前还不适合转换为 const wchar_t*。您必须固定指针,以便垃圾收集器无法移动字符串。使用 pin_ptr<> 来做到这一点。
您可以使用 Marshal::StringToHGlobalUni() 创建字符串的副本。如果 wchar_t* 需要长时间保持有效,请使用它。固定对象太久对垃圾收集器来说不是很健康。