【发布时间】: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 发送可变内存块。我找不到一个例子,我尝试过的一切都失败了。感谢收看。