目标是避免在需要const wchar_t*
时复制字符串数据。
答案似乎是肯定的,但函数PtrToStringChars
没有自己的MSDN条目(它只在KB和博客中提到作为一种技巧)。这让我很怀疑,我想和你们一起检查一下。使用该功能是否安全?
答案 0 :(得分:4)
这是一个基于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;
}
答案 1 :(得分:2)
是的,没问题。它实际上有点documented但很难找到。 C ++库的MSDN文档并不是很好。它返回一个内部指针,它不适合转换为const wchar_t *。你必须固定指针,以便垃圾收集器不能移动字符串。使用pin_ptr&lt;&gt;这样做。
您可以使用Marshal :: StringToHGlobalUni()创建字符串的副本。如果wchar_t *需要在较长时间内保持有效,请使用它。将对象固定太长对于垃圾收集器来说并不是很健康。
答案 2 :(得分:0)
根据这篇文章:http://support.microsoft.com/kb/311259 PtrToStringChars是官方支持的,可以使用。它被描述为“在vcclr.h中获取一个指向System :: String对象中包含的第一个字符的内部gc指针”。