【问题标题】:How do I represent a packed Delphi record with Python ctypes?如何用 Python ctypes 表示打包的 Delphi 记录?
【发布时间】:2013-10-17 11:26:42
【问题描述】:

我想知道是否可以使用 ctypes 处理 Delphi Packed 记录。 我有一个用 Delphi 编写的 dll,它公开了一些带有 stdcall 约定的方法。

其中一个方法是返回一个像这样打包的自定义记录:

TMapCell = packed record
    Tile : Word;
    Z : Shortint;
end;

当记录没有打包时,我可以这样处理它们:

class TMapCell(Structure):
    _fields_ = [
        ('Tile', c_ushort),
        ('Z', c_byte),
    ]

但是当我尝试使用它时,我遇到了访问冲突错误

WindowsError: exception: access violation writing 0x0000112D

【问题讨论】:

标签: python delphi record ctypes


【解决方案1】:

指定_pack_属性来控制打包:

class TMapCell(Structure):

    _pack_ = 1

    _fields_ = [
        ('Tile', c_ushort),
        ('Z', c_byte),
    ]

当然,如果您一开始就避免打包记录,那就更好了。总是喜欢对齐的记录。

【讨论】:

  • 这回答了您的问题,但可能无法解决您的 AV。问题中记录的布局对于打包和对齐是相同的。虽然有大小差异。打包记录的大小为 3,对齐的记录大小为 4。无论如何,您的 AV 很可能是由其他错误引起的。
  • 我无法控制 dll,所以我必须接受他们给我的东西。我阅读了标准文档并在此处询问之前尝试使用 _pack_ = 1,但我仍然收到 AV 错误。
  • 好吧,就像我说的,您的问题可能出在其他地方。这是您所提问题的答案。只是包装很可能不是你的问题的原因。
  • @DavidHeffernan 正如你所说,问题出在其他地方。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多