gpt4 book ai didi

c# - 如何在 C# 中将 LParam 转换为 Struct

转载 作者:太空宇宙 更新时间:2023-11-03 16:18:29 25 4
gpt4 key购买 nike

我有以下 C++ 结构

typedef struct {
char szAccountNo[11];
char szAccountName[40];
char act_pdt_cdz3[3];
char amn_tab_cdz4[4];
char expr_datez8[8];
char granted;
char filler[189];
}ACCOUNTINFO;

typedef struct {
char szDate [14];
char szServerName [15];
char szUserID [8];
char szAccountCount [3];
ACCOUNTINFO accountlist [999];
}LOGININFO;

typedef struct{
int TrIndex;
LOGININFO *pLoginInfo;
}LOGINBLOCK;

并转换成C#类

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class ACCOUNTINFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
public string szAccountNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]
public string szAccountName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)]
public string act_pdt_cdz3;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string amn_tab_cdz4;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string expr_datez8;
public char granted;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 189)]
public string filler;
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class LOGININFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string szDate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
public string szServerName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string szUserID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)]
public string szAccountCount;
[MarshalAs(UnmanagedType.Struct, SizeConst = 99)]
public ACCOUNTINFO[] accountlist;
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class LOGINBLOCK
{
[MarshalAs(UnmanagedType.I4)]
public int TrIndex;
[MarshalAs(UnmanagedType.Struct, SizeConst = 1)]
public LOGININFO pLoginInfo;
};

我使用了以下两种方法来转换WndProc中的LParam。

1. TrStruct.LOGINBLOCK lb = new TrStruct.LOGINBLOCK();
lb = (TrStruct.LOGINBLOCK)m.GetLParam(typeof(TrStruct.LOGINBLOCK));

2. TrStruct.LOGINBLOCK lb = (TrStruct.LOGINBLOCK) Marshal.PtrToStructure(m.LParam, typeof(TrStruct.LOGINBLOCK));

但是,它没有成功,也没有发出常规错误消息,而是在输出窗口中收到消息“'System.TypeLoadException' 类型的第一次机会异常发生在 mscorlib.dll 中”。谁能告诉我我的转换出了什么问题?

最佳答案

您的代码的第一个明显问题在于 CharSet.Unicode。你在非托管代码中结构的字段都被定义为char,这是一个单字节字符。您应该为所有结构使用 CharSet.Ansi

第二个问题在 LOGININFO 的最后一个字段中。它被定义为

[MarshalAs(UnmanagedType.Struct, SizeConst = 99)]
public ACCOUNTINFO[] accountlist;

但是在你的非托管代码中,它是

ACCOUNTINFO accountlist [999];

SizeConst 参数应更改为 999

关于c# - 如何在 C# 中将 LParam 转换为 Struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14931251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com