C#调用非托管Delphi DLL返回部分corrputed结构

时间:2013-11-11 18:24:41

标签: c# delphi structure unmanaged ref

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

  

11/11/2013 12:09:08 PM - 收到的活动: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
原始事件:
原始事件的十六进制5FF0904046285DE000000000000000000000000000000000000000000000000000
原始事件的字符_d?@F(]à
原始事件的二进制9524014464704093224000000000000000000000000

任何想法都会非常感激,或者如果你发现我错过了什么。

由于

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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