【问题标题】:wchar_t data being jumbled from unmanaged to managedwchar_t 数据从非托管到托管混乱
【发布时间】:2013-02-14 00:57:27
【问题描述】:

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

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

【问题讨论】:

  • 尝试查看this question 及其选择的答案。似乎 wchar_t 不能像你这样做的方式从托管代码传递到非托管代码。

标签: c# c++ pinvoke


【解决方案1】:

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

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

您也可以使用 16 位 int:

short ch1;

或者告诉编组器明确地使用每个项目做什么:

[MarshalAs(UnmanagedType.U2)] char ch1;

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 2011-11-18
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2018-03-19
    相关资源
    最近更新 更多