-1

我遇到了一些问题,其中我传递给用 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

任何想法将不胜感激,或者如果您发现我遗漏了一些东西。

谢谢

4

2 回答 2

0

好的,我发现了问题。这与我演示的内容无关。DLL 的初始化(加载一些帐户)引起了问题。感谢您的帮助和您宝贵的时间

于 2013-11-13T02:44:37.940 回答
0

我认为您的问题是 Delphi 记录打包与您的定义不匹配,自从我在 Delphi 中使用记录以来已经有一段时间了,但是尝试在 MacAddress 之后立即添加 2 个字节的填充符(或将您的结构布局打包更改为 4)。老实说,我认为默认的 Delphi“记录打包”与您的声明相匹配,但所描述的行为表明并非如此。

于 2013-11-11T18:49:58.763 回答