4

目标是避免在需要时复制字符串数据const wchar_t*

答案似乎是肯定的,但该函数PtrToStringChars没有自己的 MSDN 条目(仅在 KB 和博客中作为技巧提及)。这让我很怀疑,我想和你们核实一下。使用该功能是否安全?

4

2 回答 2

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;
}
于 2011-02-12T20:16:38.697 回答
2

是没有问题。它实际上有一些记录,但很难找到。C++ 库的 MSDN 文档不是很好。它返回一个内部指针,目前还不适合转换为 const wchar_t*。您必须固定指针,以便垃圾收集器无法移动字符串。使用 pin_ptr<> 来做到这一点。

您可以使用 Marshal::StringToHGlobalUni() 创建字符串的副本。如果 wchar_t* 需要长时间保持有效,请使用它。固定对象太久对垃圾收集器来说不是很健康。

于 2010-06-15T14:43:37.300 回答