2017-05-08 2 views
1

Je encapsule une bibliothèque C dans Python via ctypes. En ce moment je suis resté sur une ligne ou plus sur un paramètre. Ici, le code C:python ctypes - wrap void pointer

void* gVimbaHandleFake = (void*)1; 
err = VmbFeatureBoolGet(gVimbaHandleFake, "GeVTLIsPresent", &isGigE); 

Le problème est cet étrange pointeur de vide. En général je sais ce qu'est un pointeur vide mais celui-ci semble être "spécial". Si je change le 1 dans (void*)1 le programme ne fonctionne plus (il s'agit de trouver des caméras réseau). Il ne s'écrase pas mais ne trouve plus les caméras.

J'ai essayé beaucoup de choses différentes, les derniers essais en Python:

gVimbaHandle = cast(1, c_void_p) 
err = self.dll.VmbFeatureBoolGet(byref(gVimbaHandle), "GeVTLIsPresent", byref(isGigE)) 

a aussi essayé la voie « normale »:

gVimbaHandle = c_void_p(1) 

Mon isnt programme s'écraser, mais il me dit que la poignée est invalide ... Quand j'ai regardé dans le pointeur avec gVimbaHandle.value je reçois 1L en sortie. Serait-ce le problème, le L pour le type de données long?

Est-ce que quelqu'un sait comment résoudre ce problème ou peut m'expliquer le pointeur "spécial" (void*)1 en C?

Merci beaucoup!

+0

vous passez le pointeur par référence, mais l'exemple de code C, il passe par la valeur. Utilisez 'gVimbaHandle = c_void_p (1)' et 'VmbFeatureBoolGet (gVimbaHandle," GeVTLIsPresent ", byref (isGigE))'. – eryksun

+0

Oh ouais c'est vrai, a été un peu confondu avec les trucs de combinaison python et C pointer et n'a pas vu cela ... merci beaucoup. Je l'ai corrigé pour moi Si vous le postez comme réponse, je le marquerai comme solution. Merci encore –

Répondre

1

Donc, la solution/réponse est:

gVimbaHandle = c_void_p(1) 
err = self.dll.VmbFeatureBoolGet(gVimbaHandle, "GeVTLIsPresent", byref(isGigE)) 

grâce @eryksun