看板 Python 關於我們 聯絡資訊
※ 引述《cobrasgo (體重突破所有均線)》之銘言: : 另外之前試不起來的主因是這行 : CMPFUNC = CFUNCTYPE(c_int, comtypes.BSTR) : 就是create ctype的callback function時 : 它應該是會去檢查這個type對不對 : 我把參數那欄改成comtypes.BSTR之後 : 就可以work了 : 我想簡單的說就是它對參數的格式 : 檢查很嚴格吧 透過 CFUNCTYPE/WINFUNCTYPE 來建立 function wrapper type 時不會檢查 formal parameter 的型別,而是指定的 formal parameter 型別會決定 wrapper function 如何處理 actual arguments 與如何傳遞給 wrapped function。 把一個 Python function/callable wrapping 成 function wrapper type(比如 上述的 CMPFUNC)時,也不會檢查型別,因為 Python function 的 formal parameter 在 Python level 沒有 compile-time 型別資訊。 : 但是還有兩個問題 : 1) 有error : Traceback (most recent call last): : File "_ctypes/callbacks.c", line 320, in 'converting callback result' : TypeError: an integer is required : Exception in <bound method qyAPI._oiCallback of <__main__.qyAPI instance : at 0x00EE8C88>> ignored : Traceback (most recent call last): : File "C:\qy\2.1.5\ctypes\qyAgent.py", line 81, in go : self._GetUserAccount() : ValueError: Procedure probably called with too many arguments (942000 bytes : in excess) : 官網上對這個error的說法是1)錯誤的參數個數,或是2)錯誤的calling convention : 應該是第二個wrong calling convention : 但是這個我就沒有想法了囧 以參數過多來看,你使用的套件(DLL)應該是以 __stdcall 方式來調用註冊的 callback function,那麼你在定義 wrapper function type 時,應使用 WINFUNCTYPE。 CMPFUNC = WINFUNCTYPE(c_int, comtypes.BSTR) 後來實際去 download 你提供的 API 文件來看,這個 DLL 實際上是一個 COM object 的實作,或許你可以考慮在你的 Python runtime 上安裝 pywin32 套件 或是直接安裝有內建(整合) pywin32 的 Python implementation(如 ActiveState 出品的 ActivePython),以操作 COM object 的方式來使用該 DLL。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.174.5 ※ 編輯: sbrhsieh 來自: 220.136.174.5 (01/27 20:38) ※ 編輯: sbrhsieh 來自: 220.136.174.5 (01/27 21:03)