【问题标题】:C# Call to unmanaged Delphi DLL returns a partially corrputed structureC# 调用非托管 Delphi DLL 返回部分损坏的结构
【发布时间】:2013-11-11 18:24:41
【问题描述】:

我遇到了一些问题,即我传递给用 Delphi(版本未知)编写的非托管 DLL 的结构中的数据似乎已损坏。有人请对我的代码进行完整性检查。

该项目是使用 VS2012 针对 X86 平台构建的。它在 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非托管函数定义为this

[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
原始事件:
原始事件的十六进制数            5FF0904046285DE0000000000000000000000000000000000000000000000000
原始事件的字符    _d?@F(]à
原始事件的二进制文件         9524014464704093224000000000000000000000000

任何想法都将不胜感激,或者如果您发现我遗漏了什么。

谢谢

【问题讨论】:

  • 结构和记录匹配。现在是 SSCCE 时间。
  • 根据您对 Gary 的答案的评论,您可能会考虑编辑您的答案,显示真正的问题并可能将您的解决方案添加为答案。就目前而言,它可能会误导问题/答案的未来读者。

标签: c# delphi structure unmanaged ref


【解决方案1】:

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

【讨论】:

  • Delphi 打包匹配 C# 打包
  • 你试过了吗?正如我所说,这就是它“中断”的地方,我认为您声明的包装与我认为的包装相符,但行为表明并非如此。如果它仍然坏掉,我不会感到惊讶。
  • 哈哈,那不是我的评论,那是大卫的评论。我还没有尝试过,但会在接下来的一两个小时内尝试。感谢您到目前为止的回复。
  • 都没有用。我尝试在 mac 地址之后放入一个字节数组,并尝试多种大小(2 到 8)只是为了咧嘴笑。我还将包大小设置为 4,也不行。
  • 请不要接受错误的答案。这对任何人都没有帮助。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2011-03-04
    相关资源
    最近更新 更多