1
我打算在我的Python應用程序中使用由DLL導出的C函數。這個特殊的函數將多個回調函數作爲參數,所以我在擺弄python中用ctypes定義這種回調。不過,我很快就死在這個簡單的測試:Python ctypes回調函數給出「TypeError:回調函數的無效結果類型」
from ctypes import *
someFunction = CFUNCTYPE(POINTER(c_long), c_long)
def someFunctionPy(someLong):
return pointer(c_long(someLong))
print POINTER(c_long)
print someFunctionPy(1)
someFunctionImpl = someFunction(someFunctionPy)
凡someFunctionImpl
然後可以傳遞給C函數的參數。這使我有以下錯誤:
<class '__main__.LP_c_long'>
<__main__.LP_c_long object at 0x022928F0>
Traceback (most recent call last):
File "test.py", line 12, in <module>
someFunctionImpl = someFunction(someFunctionPy)
TypeError: invalid result type for callback function
打印輸出告訴我該函數返回正確類型的對象,所以我缺少什麼嗎?
編輯:它似乎工作時,我使用someFunction = CFUNCTYPE(c_void_p, c_long)
,即使c_void_p
和POINTER(c_long)
有不同的類型。咦?
雖然這並沒有什麼幫助,因爲最終我不得不使用預定義的CFUNCTYPE
,它具有POINTER(c_int)
作爲返回類型。
使用void指針有什麼問題? – cdonts
正如我所提到的,最終我將不得不使用其他人定義的「CFUNCTYPE」,並且我無法編輯它。那'CFUNCTYPE'具有'POINTER(c_long)'作爲返回類型。 – Maas
回調函數使用返回類型的'setfunc'來設置FFI結果緩衝區中的返回值。只有簡單類型具有'setfunc',包括簡單指針類型'c_char_p','c_wchar_p'和'c_void_p'。非簡單的指針類型,數組類型和結構類型沒有'setfunc',所以它們不能被回調直接返回。 – eryksun