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