2015-10-08 45 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

回答