2015-10-08 62 views
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_pPOINTER(c_long)有不同的類型。咦?

雖然這並沒有什麼幫助,因爲最終我不得不使用預定義的CFUNCTYPE,它具有POINTER(c_int)作爲返回類型。

+0

使用void指針有什麼問題? – cdonts

+0

正如我所提到的,最終我將不得不使用其他人定義的「CFUNCTYPE」,並且我無法編輯它。那'CFUNCTYPE'具有'POINTER(c_long)'作爲返回類型。 – Maas

+0

回調函數使用返回類型的'setfunc'來設置FFI結果緩衝區中的返回值。只有簡單類型具有'setfunc',包括簡單指針類型'c_char_p','c_wchar_p'和'c_void_p'。非簡單的指針類型,數組類型和結構類型沒有'setfunc',所以它們不能被回調直接返回。 – eryksun

回答