我遇到一些问题,我传递给用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
任何想法都会非常感激,或者如果你发现我错过了什么。
由于
答案 0 :(得分:0)
我认为你的问题是Delphi记录打包与你的定义不符,自从我在Delphi中使用记录以来已经有一段时间了,但是尝试在MacAddress之后立即添加2个字节的填充(或者将你的struct layout packing更改为4) 。老实说,我认为默认的Delphi“记录包装”符合您的声明,但所描述的行为表明情况并非如此。
答案 1 :(得分:0)
好的,我发现了问题。这与我所展示的无关。 DLL的初始化(加载一些帐户)导致了问题。感谢您的帮助和宝贵的时间