Windows環境でdllからCコールバック を呼び出す際に呼び出す必要のあるPythonコールバックを作成しようとしています。この問題を理解するには、以下のコードをご覧ください。CコールバックへのPythonラッパー
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);
OUTPUT:
>>>
global test= 10000
1
5
7
33
99
Output of connect : 0
SetByteTotalsCallback = 0
gtx = 0
grx = 0
>>>>
現在の問題は、全体のプログラムが正常に呼び出されるということです が、Pythonのコールバックがありませんまったく呼ばれる。プログラムは のgobiDLL.SetByteTotalsCallback(コールバック、c_byte(256))メソッドから0のステータスで終了しますが、コール中に というpythonで書かれたcallback()メソッドは呼び出されません。
あなたは、Pythonコールバックを入力するのに役立つかもしれない点を教えてください。 他のサンプルqsort()メソッドは、ポインタをPython関数ポインタにすばやく渡します。 ここで問題の根本的な原因を得ることはできません。
TIA、
アンソニー
問題を最小限の再現可能なシナリオに減らすことができれば、はるかに簡単です。ありがとう! – rafalotufo
私はこの例をさらに短くすることを提案します(コードの半分をもう一度することができると思われます)。しかし、これは一般的な状況ではないので、おそらく誰かがコンパイルして自分自身で見ることができるビジュアルスタジオソリューションを提供することを検討してください。 – Arafangion