2013-07-31 24 views
6

Próbuję napisać kod Pythona do wywołania funkcji DLL i utknąć w funkcji poniżej, , które moim zdaniem jest związane z funkcją wywołania zwrotnego typedef lub funkcją wskaźnik rzecz.Pisanie Python ctypes funkcji wywołania zwrotnego funkcji w C

Przetestowałem poniższy kod, gdy wywoływana jest funkcja wywołania zwrotnego, python ulega awarii (powiadomienie o oknie - python.exe przestał odpowiadać) bez komunikatów debugowania.

Jestem głęboko mylić, każda pomoc będzie mile widziane :)

Dzięki!

C:

#ifdef O_Win32 
/** @cond */ 
#ifdef P_EXPORTS 
#define API __declspec(dllexport) 
#else 
#define API __declspec(dllimport) 
#endif // #ifdef P_EXPORTS 
/** @endcond */ 
#endif // #ifdef O_Win32 

// Type definition 
typedef void (__stdcall *StatusCB)(int nErrorCode, int nSID, void *pArg); 

//Function 
void GetStatus(StatusCB StatusFn, void *pArg); 

Python:

from ctypes import * 

def StatusCB(nErrorCode, nSID, pArg): 
    print 'Hello world' 

def start(): 
    lib = cdll.LoadLibrary('API.dll') 
    CMPFUNC = WINFUNCTYPE(c_int, c_int, c_void_p) 
    cmp_func = CMPFUNC(StatusCB) 
    status_func = lib.GetStatus 
    status_func(cmp_func) 

Odpowiedz

9

Twój typ zwrotna ma niewłaściwy podpis; zapomniałeś typ wyniku. Zbiera także śmieci, gdy funkcja się kończy; musisz zrobić to globalnie.

W twoim wywołaniu GetStatus brakuje argumentu pArg. Dodatkowo podczas pracy ze wskaźnikami musisz zdefiniować argtypes, inaczej będziesz mieć problemy na 64-bitowych platformach. Domyślny typ argumentu ctypes to C int.

from ctypes import * 

api = CDLL('API.dll') 
StatusCB = WINFUNCTYPE(None, c_int, c_int, c_void_p) 

GetStatus = api.GetStatus 
GetStatus.argtypes = [StatusCB, c_void_p] 
GetStatus.restype = None 

def status_fn(nErrorCode, nSID, pArg):   
    print 'Hello world' 
    print pArg[0] # 42? 

# reference the callback to keep it alive 
_status_fn = StatusCB(status_fn) 

arg = c_int(42) # passed to callback?  

def start():   
    GetStatus(_status_fn, byref(arg)) 
+0

Działa! dzięki za trylion! – genxstylez

Powiązane problemy