我遇到了一些问题,其中我传递给用 Delphi(版本未知)编写的非托管 DLL 的结构中的数据似乎已损坏。有人请对我的代码进行完整性检查。
该项目是使用针对 X86 平台的 VS2012 构建的。它在 Win7 32 上运行。.NET Framework 4.0
这是 Delphi 结构的结构。
type
TReportingEvent = packed record
EventID: integer;
MACAddress: array[0..5] of byte;
EventSequence : word;
FormatID: word;
RawEvent: array[0..31] of byte;
end;
pTReportingEvent = ^TReportingEvent;
这是我的 C# 项目中定义的结构
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct REPORTING_EVENT
{
public Int32 EventID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAC_ADDRESS_SIZE)]
public Byte[] MacAddress;
public UInt16 EventSequence;
public UInt16 FormatID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_EVENT_SIZE)]
public Byte[] RawEvent;
public REPORTING_EVENT(Int32 iEventID)
{
this.EventID = iEventID;
this.EventSequence = 0;
this.FormatID = 0;
this.MacAddress = new Byte[MAC_ADDRESS_SIZE];
this.RawEvent = new Byte[MAX_EVENT_SIZE];
}
};
常量是这样定义的
public const int MAC_ADDRESS_SIZE = 6;
public const int MAX_EVENT_SIZE = 32;
Delphi非托管函数定义为这样
[DllImport("ipdox.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
public static extern int GetEventEx(ref REPORTING_EVENT Event);
我调用函数的代码是这样的
Console.WriteLine("Reporting Event. Event index = " + m.WParam.ToString());
REPORTING_EVENT rptEvent = new REPORTING_EVENT((Int32)m.WParam);
long iRptResult = GetEventEx(ref rptEvent);
我构建得很好,代码执行没有任何问题,但显示的数据不符合预期。特别是两个字值和原始事件字节数据。
我期待这样的事情(它使用我使用的相同 DLL)。
2013 年 11 月 11 日下午 12:09:08 - 收到事件:74 发件人:0019BA0216D9 事件序列号:1206 报告格式 ID:0 原始数据:99 98 18 31 2A A1 AA 1D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
但我在我的输出中得到了这个。格式是一些随机数,事件 id 是正确的,MAC 也是正确的。其他一切似乎都不对。
报告事件。
事件索引 = 38
新事件预构建信息字符串,格式 id = 7921 和事件序列 = 8332
新事件事件 ID:38
MAC 地址:00:19:BA:02:16:D9
事件序列:8332
格式 ID:7921
原始事件:原始事件的
十六进制 5FF0904046285DE000000000000000000000000000000000000 原始事件的
字符 _d?@F(]à
原始事件的二进制 9524014464704093224000000000000000000000
任何想法将不胜感激,或者如果您发现我遗漏了一些东西。
谢谢