C# - 如何编组LPWSTR数组?

Dav*_*eUK 3 c# arrays string marshalling

我正在尝试编组一个类似于以下内容的c ++结构:

typedef struct _SOME_STRUCT
{
     DWORD count;
     LPWSTR *items;
}
Run Code Online (Sandbox Code Playgroud)

"items"是LPWSTR的数组(确切的数字由"count"表示).在C#中,我将结构表示为:

[StructLayoutAttribute(LayoutKind.Sequential)]
internal struct SOME_STRUCT
{    
     internal uint count;
     internal IntPtr items;
}
Run Code Online (Sandbox Code Playgroud)

然后在我的代码中,我正在做这样的事情(其中mystruct的类型为SOME_STRUCT):

if (mystruct.count > 0)
{
    for (int x = 0; x < mystruct.count; x++)
    {
        IntPtr ptr = new IntPtr(mystruct.items.ToInt64() + IntPtr.Size * x);
        string item = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(ptr));
    }
}
Run Code Online (Sandbox Code Playgroud)

计数是正确的,但字符串项出现乱码.我确信我必须做一些愚蠢的事情,因为我之前已经使用过其他类型的数组...而不是LPWSTR.

Dav*_*Yaw 5

LPWSTR是一个"宽"字符串,即Unicode.PtrToStringUni可能会更好地为您服务.

此外,IntPtr确实有+运算符重载,你应该能够做到IntPtr ptr = mystruct.items + (IntPtr.Size * x)