0
的Python 2.7.8,Windows 7的崩潰蟒蛇,植酮USB編程器的DLL的Python ctypes的時候通過結構被刪除
成功後調用DLL中的API函數,並調用適當的響應爲傳遞的參數(傳入單一結構)。當結構對象被刪除,或某些(但不是全部)包含的屬性被訪問時,python解釋器崩潰。
更新: 事實證明,API文檔已過時,並且與include文件不匹配。一旦我更新包含文件後面的結構,問題就解決了。
更新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)'。 – eryksun 2015-03-31 23:12:49
返回的狀態碼與COM'HRESULT'不兼容(即負值表示錯誤)。 'ACI_ERR_ *'值的範圍從0到14.如果你想自動檢查結果,使用'Launch.errcheck'。閱讀使用['errcheck']的文檔(https://docs.python.org/2/library/ctypes.html#ctypes._FuncPtr.errcheck)。 – eryksun 2015-03-31 23:15:59
在遵循包含文件之後,而不是文檔之後,一切似乎都在完美運行。感謝你的幫助,尤其是你去研究我的問題的時間長度。 – Blaine 2015-04-01 16:18:52