0

从这个精彩的网络上阅读了很多内容后,我需要一些帮助。

我有这个功能(在一个dll中):

kvStatus kvSetNotifyCallback  ( const int  hnd, kvCallback_t  callback,  void *  context,  
  unsigned int  notifyFlags);

如何从 Python 调用这个函数?

我试过了:

kvSetNotifyCallback(c_int(hnd1),c_void_p(self.can_rx()),None, c_int(canNOTIFY_RX))

def can_rx(self):

        print("OK")

函数 can_rx 只执行一次。有什么建议么?非常感谢。毫米

4

1 回答 1

0

第一件事:

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 也可以定义为全局函数。

于 2014-08-28T10:41:37.673 回答