【问题标题】:Python ctypes crashes python when passed structure is deleted删除传递的结构时,Python ctypes崩溃python
【发布时间】:2015-03-31 22:14:55
【问题描述】:

Python 2.7.8、Windows 7、Phyton USB 程序员的 DLL

在 DLL 中成功调用 API 函数后,该调用对传递的参数做出适当响应(以单个结构传递)。当结构对象被删除或某些(但不是全部)包含的属性被访问时,python 解释器会崩溃。

更新: 事实证明,API 文档已经过时,并且与包含文件不匹配。一旦我更新了包含文件之后的结构,问题就解决了。

更新 2: 我无法处理需要传递的可变数组。它是“数据”。我已经尝试了很多次迭代,但我找不到结构中具有可变结构的示例。

MaxMemorySize = 1024
MemoryBuffer = ctypes.create_string_buffer("Hello", MaxMemorySize)

class Memory_Params(ctypes.Structure):
    _fields_ =  [("Size", ctypes.wintypes.UINT),
                 ("BufferNumber", ctypes.wintypes.UINT),
                 ("LayerNumber", ctypes.wintypes.UINT),
                 ("AddressLow", ctypes.wintypes.DWORD),
                 ("AddressHigh", ctypes.wintypes.DWORD),
                 ("Data", ctypes.c_char_p ),
                 ("DataSize", ctypes.wintypes.DWORD),
                 ("FillValue", ctypes.wintypes.DWORD)
                ]
WriteLayer = ctypes.windll.ACI.ACI_ReadLayer
WriteLayer.argtypes = [ctypes.POINTER(Memory_Params)]
WriteLayer.restype = ctypes.HRESULT

WData = Memory_Params(ctypes.sizeof(Memory_Params),0,0,0,0,MemoryBuffer,15,0)

print 'write result', WriteLayer(WData)

创建 Memory_Params 对象通常会引发错误。虽然当我将类型更改为固定字符串时,会创建对象,但 API 调用返回 1,这意味着: define ACI_ERR_INVALID_PARAMS_SIZE 1 // ACI 函数中的结构大小无效

【问题讨论】:

  • 你验证ACI_Launch_Params的定义了吗?在我刚刚下载的版本中,ACIProg.h 使用 3 个额外的输出参数定义了这个结构:('NumSites', wintypes.UINT),('ConnectionId', wintypes.LPVOID),('ProgrammerName', ctypes.c_char * 64)
  • 此外,返回的状态代码与 COM HRESULT 不兼容(即负值表示错误)。 ACI_ERR_* 的值范围为 0 到 14。如果要自动检查结果,请使用 Launch.errcheck。阅读使用errcheck的文档。
  • 在遵循包含文件而不是文档之后,一切似乎都很完美。感谢您的帮助,尤其是您研究我的问题的时间。
  • 请参阅更新 2:现在我一直在尝试向 API 发送可变内存块。我找不到一个例子,我尝试过的一切都失败了。感谢收看。

标签: python windows dll ctypes


【解决方案1】:

吸取的教训是:如果您在使用 ctypes 接口时遇到不稳定的行为,即使 API 函数似乎按预期完成。仔细检查您的论点是否正确。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多