2012-04-26 5 views
1

Il existe une fonction d'une DLL (langage C) link("parameters", &connection); qui prend un paramètre de chaîne et initialise une connexion.passage objet en tant qu'argument de la fonction

Il existe une fonction , où connection est l'objet initialisé avec un appel à link().

Je passe l'objet de connexion Python à la fonction connect() comme argument

connection_t = ctypes.c_uint32 
link = mydll.link 
link.argtypes=(ctypes.c_char_p, ctypes.POINTER(connection_t)) 
connect = mydll.connect 
connect.argtypes=(connection_t,) 
... 
connection = connection_t() 
link ("localhost: 5412", ctypes.byref(connection)) 
... 

Mais si je transfère l'objet « connexion » à une autre fonction de la bibliothèque mydll, la fonction retourne une valeur, mais la valeur est incorrecte .

func=mydll.func 
status_t=ctypes.c_uint32 
status=status_t() 
func.argtypes=(ctypes.c_ulong,ctypes.POINTER(status_t)) 
result=func(connection, ctypes.byref(status)) 

Dans cet exemple result=0, mais dans le C-variante de ce code, je reçois une valeur correcte (pas 0)

Pourquoi?

+0

Êtes-vous sûr que vous devriez regarder à 'result' et non' status'? – yak

+0

'connection_t' est un' ctypes.c_uint32', mais le premier 'func.argtypes' est un' ctypes.c_ulong'? – martineau

+0

yak, désolé, je veux dire la valeur de «statut». Mais si 'status' est incorrect alors la valeur 'result' est également incorrecte. – KLM

Répondre

0

Sur la base de votre commentaire décrivant C APIs:

link(const char* set, conn_type* connection); 
func(conn_type* connection, uint32_t* status); 

Depuis func un pointeur sur un type de connexion, le code doit être quelque chose comme:

mydll=ctypes.CDLL('mydll') 
connection_t = ctypes.c_uint32 
link = mydll.link 
link.argtypes=(ctypes.c_char_p, ctypes.POINTER(connection_t)) 
connection = connection_t() 
link("localhost: 5412", ctypes.byref(connection)) 

func=mydll.func 
status_t=ctypes.c_uint32 
status=status_t() 
func.argtypes=(ctypes.POINTER(connection_t),ctypes.POINTER(status_t)) 
result=func(ctypes.byref(connection), ctypes.byref(status)) 
Questions connexes