第一件事:
ctypes WINFUCNTYPE 或 CFUNCTYPE 的 argtypes 应该是 c_void_p
您定义的函数的 argtypes 应该是 py_object 而不是 c_void_p 以便您也可以传递结构和数组的对象。
然后在回调函数中将 void_p 数据转换为
ct.cast(userdata,ct.py_object).value
第二件事:
只运行一次的代码:在代码底部放置一个返回值。返回 1 或返回 TRUE
例子:
CALLBACKFUNC = WINFUNCTYPE("returnvalue",c_int,c_void_p)
kvSetNotifyCallback.argtypes = [c_int,CALLBACKFUNC,py_object,c_uint]
然后在函数中:
def can_rx(arg1,arg2):
arg3 = cast(arg2,py_object).value #yields object value
print arg1
print arg3
return 1 #for continuing execution
CALLBACK FUNCTION can_rx 应在 CALLBACKFUNC(can_rx) 处调用,与 arg1 一起传递的数据应在 py_object 位置传递。
所以你应该把你的回调称为:
kvSetNotifyCallback(somevalue,CALLBACKFUC(can_rx),arg2,canNOTIFY_RX)
arg2 是要传递给回调函数 can_rx 的值
can_rx 也可以定义为全局函数。