wchar_t数据从非托管状态混乱到托管状态
本文关键字:状态 混乱 数据 wchar | 更新日期: 2023-09-27 17:58:57
我在C#中有一个托管的GUI,在C++中有非托管的DLL。我通过引用填充结构的DLL函数来传递结构。该结构有几个wchart元素和几个字符串。
在DLL中,所有数据在返回GUI之前看起来都很好。例如:
struct1->ch1 = 0x1234;
struct1->ch2 = 0x5678;
struct1->ch3 = 'ab';
struct1->ch4 = 'cd';
但是当从DLL返回结构体时,数据是乱码的。
struct1->ch1 == 0x0034
struct1->ch2 == 0x0012
struct1->ch3 == 0x0078
struct1->ch4 == 0x0056
其他字符串元素返回良好。
填充的char数据是单字节的,所以我知道我可以使用BYTE类型,但我想弄清楚这一点。
我是管理/非管理关系的新手,所以我不知道发生了什么。有什么想法吗?
有几个选项。首先,您可以使用将整个结构标记为Unicode(因此chars
将被解释为wchar_t
)
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct MyStruct { ... }
或者,您可以使用16位int:
short ch1;
或者告诉整理人员使用明确地执行每个项目
[MarshalAs(UnmanagedType.U2)] char ch1;