0

我有一个 C# 中的托管 GUI 和 C++ 中的非托管 DLL。我通过引用填充它的 DLL 函数来传递一个结构。该结构有几个 wchar_t 元素和几个字符串。

在 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 类型,但我想弄清楚这一点。

我是托管/非托管关系的新手,所以我不确定发生了什么。有任何想法吗?

4

1 回答 1

0

有几种选择。首先,您可以将整个结构标记为 Unicode(因此chars将被解释为wchar_t):

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct MyStruct { ... }

或者,您可以使用 16 位 int:

short ch1;

或者告诉编组器使用以下命令明确地执行每个项目:

[MarshalAs(UnmanagedType.U2)] char ch1;
于 2013-02-14T03:21:12.920 回答