title: Python Wrapper to a C Callback
body: <p>Trying to create a python callback which needs to be invoked while calling the C callback 
  from a dll in Windows environment. Please review the code below to understand the issue.</p>
  
  <pre><code>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 &amp; 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
  </code></pre>
  
  <p>The DLL Documents the Prototype and the callback for the SetByteTotalsCallback() method as shown below.</p>
  
  <p>Prototype :</p>
  
  <pre><code>ULONG QCWWANAPI2K SetSessionStateCallback( tFNSessionState pCallback );
  </code></pre>
  
  <p>Callback :</p>
  
  <pre><code>void ByteTotalsCallback( ULONGLONG  txTotalBytes, ULONGLONG rxTotalBytes );
  </code></pre>
  
  <p>OUTPUT :</p>
  
  <pre><code>&gt;&gt;&gt; 
  global test= 10000
  1
  5
  7
  33
  99
  Output of connect :  0
  SetByteTotalsCallback =  0
  gtx =  0
  grx =  0
  &gt;&gt;&gt;&gt;
  </code></pre>
  
  <p>The current problem is that the whole program gets called properly, 
  but the python callback does not get called at all. The program exits with 0 status from 
  gobiDLL.SetByteTotalsCallback(callback, c_byte(256)) method, but the callback() method written 
  in python does not called during the call.</p>
  
  <p>Could you please point out what could help enter the python callback ?
  The other sample qsort() method passes the pointer to the python function pointer wonderfully.
  At a loss to get the root cause of the issue here.</p>
  
  <p>TIA,</p>
  
  <p>Anthony</p>