2015-03-31 22 views
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函數中的結構體大小無效

+0

您是否驗證過'ACI_Launch_Params'的定義?在剛剛下載的版本中,ACIProg.h使用另外3個輸出參數定義了此結構:'('NumSites',wintypes.UINT),''('ConnectionId',wintypes.LPVOID),''('ProgrammerName',ctypes .c_char * 64)'。 – eryksun 2015-03-31 23:12:49

+0

返回的狀態碼與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

+0

在遵循包含文件之後,而不是文檔之後,一切似乎都在完美運行。感謝你的幫助,尤其是你去研究我的問題的時間長度。 – Blaine 2015-04-01 16:18:52

回答

0

獲得的教訓是:If即使API函數似乎按預期完成,您也會遇到ctypes接口不穩定的行爲。仔細檢查你的論點是否正確。