是否可以在C ++ / CLI中获取指向String ^的内部数组的指针?

时间:2010-06-15 14:32:25

标签: string c++-cli wchar-t

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

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

3 个答案:

答案 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指针”。