【发布时间】:2011-06-20 14:31:01
【问题描述】:
尝试创建需要在调用 C 回调时调用的 python 回调 来自 Windows 环境中的 dll。请查看下面的代码以了解问题。
from ctypes import *
#---------qsort Callback-------------#
IntArray5 = c_int * 5
ia = IntArray5(5,1,7,33,99)
libc = cdll.msvcrt
qsort = libc.qsort
qsort.restype = None
CMPFUNC = CFUNCTYPE(c_int,POINTER(c_int),POINTER(c_int) )
test = 0
def py_cmp_func(a,b):
#print 'py_cmp_func:',a[0],b[0]
global test
test = 10000
return a[0]-b[0]
cmp_func = CMPFUNC(py_cmp_func)
qsort(ia, len(ia), sizeof(c_int), cmp_func)
print "global test=",test
for item in ia : print item
#----------Load DLL & Connect ------------#
gobiDLL = WinDLL("C:\LMS\QCWWAN2k.dll")
print 'Output of connect : ',gobiDLL.QCWWANConnect()
#----------SetByteTotalsCallback----------#
tx = POINTER(c_ulonglong)
rx = POINTER(c_ulonglong)
proto_callback = WINFUNCTYPE(c_void_p,tx,rx)
gtx = grx = 0 # Used to copy the response in the py_callback
def py_callback(t,r):
sleep(10)
print 'python callback ...'
print "tx=",t,"rx=",r
global gtx,grx
gtx = 5000 # gtx = t
grx = 2000 # grx = r
#return 0
callback = proto_callback(py_callback)
gobiDLL.SetByteTotalsCallback.restype = c_ulong
gobiDLL.SetByteTotalsCallback.argtypes = [proto_callback,c_byte]
print "SetByteTotalsCallback = ",gobiDLL.SetByteTotalsCallback(callback, c_byte(256))
print "gtx = ",gtx
print "grx = ",grx
DLL 记录了原型和 SetByteTotalsCallback() 方法的回调,如下所示。
原型:
ULONG QCWWANAPI2K SetSessionStateCallback( tFNSessionState pCallback );
回调:
void ByteTotalsCallback( ULONGLONG txTotalBytes, ULONGLONG rxTotalBytes );
输出:
>>>
global test= 10000
1
5
7
33
99
Output of connect : 0
SetByteTotalsCallback = 0
gtx = 0
grx = 0
>>>>
当前的问题是整个程序被正确调用, 但是python回调根本没有被调用。程序以 0 状态退出 gobiDLL.SetByteTotalsCallback(callback, c_byte(256)) 方法,但是写的是callback()方法 在python中调用过程中不调用。
您能否指出什么可以帮助输入 python 回调? 另一个示例 qsort() 方法将指针完美地传递给 python 函数指针。 在这里找不到问题的根本原因。
TIA,
安东尼
【问题讨论】:
-
如果您可以将问题减少到最小的可重现场景,那么为您提供帮助会容易得多。谢谢!
-
我建议使示例更短(我怀疑您可以再次将代码减半),但另外,鉴于这不是常见的情况,也许考虑提供一个视觉工作室解决方案,有人可以自己编译看看。