2009-06-15 6 views
0

Hey! Comme vous avez pu le remarquer, j'ai un problème ennuyeux avec les ctypes. J'essaie de communiquer avec un instrument et pour ce faire, je dois utiliser ctypes pour communiquer avec le pilote DLL.ctypes en python, problème appelant une fonction dans une DLL

jusqu'à présent, je suis parvenu à exporter la DLL en faisant ceci:

>>> from ctypes import * 
>>>maury = WinDLL('MLibTuners') 
>>> maury 
(WinDLL 'MlibTuners', handle 10000000 at 9ef9d0) 
>>> maury.get_tuner_driver_version() 
(_FuncPtr object at 0x009F6738) 
>>> version_string = create_string_buffer(80) 
>>> maury.get_tuner_driver_version(version_string) 
2258920 
>>> print version_string.value 
'Maury Microwave MT993V04 Tuner Driver DLL, Version 1.60.00, 07/25/2007' 

Et ça marche assez bien, d'après la documentation qu'il est censé enregistrer la DLL du pilote Tuner dans la chaîne 80 octets donnée en tant que paramètre Cependant, lorsque j'essaie d'utiliser la fonction appelée add_tuner, elle échoue. Voici ce que dit la documentation:

short add_tuner(short tuner_number, char model[], short serial_number, 
       short ctlr_num, short ctlr_port, short *no_of_motors, long max_range[], 
       double *fmin, double *fmax, double *fcrossover, char error_string[]) 

c'est ainsi que j'ai essayé d'appeler la fonction ci-dessus: Les paramètres qui sont modifiés sont tous les pointeurs et max_range [], selon le manuel les valeurs ci-dessous sont corrects aussi , je ne sais pas pourquoi je continue à obtenir une violation d'accès fenêtres écriture 0x00000000

no_motors = pointer(c_short()) 
f_min = pointer(c_double()) 
f_max = pointer(c_double()) 
f_crossover = pointer(c_double()) 
maury.add_tuner(c_short(0), c_char_p('MT982EU'), c_short(serial_number), c_short(0), 
           c_short(1),no_motors, c_long(), 
f_min,f_max,f_crossover, create_string_buffer(80)) 

Le numéro de série est cependant censuré par laissé à une variable se référant. Quelqu'un sait quoi faire?, Voyez-vous des erreurs avec ma contribution?

Merci /Mazdak

Répondre

3

je me dis que c'est la valeur que vous passez à l'argument long max_range[]. La fonction attend un pointeur sur un entier long (il demande un tableau de long entiers), mais vous passez une valeur longue de zéro (résultat de l'appel c_long()), qui est implicitement convertie en un pointeur NULL. Je soupçonne que la fonction essaie alors d'écrire à l'adresse passée à max_range, ie. le pointeur NULL, d'où la violation d'accès à l'adresse 0x00000000.

Pour créer un tableau de long s pour passer max_range, vous créez d'abord le type de tableau en multipliant le type de données de tableau avec la taille du tableau (un peu bavarde pour plus de clarté):

array_size = 3 
ThreeLongsArrayType = c_long * array_size 

Vous pouvez puis instanciez un tableau comme avec n'importe quelle autre classe Python:

array = ThreeLongsArrayType() 
+0

Ow! c'est vrai !, totalement raté celui-là, ça doit être ça. Alors, comment déclarer un tableau avec c_long() s ?, est-ce arrayLong = c_long() * 3? Cause, quand je change c_long à arrayLong il dit qu'il ne sait pas comment convertir le paramètre 7 (ctypes.argumentError) –

+0

J'ai ajouté une explication sur la façon de faire cela à ma réponse :) – Steef

+0

Merci! ça a fonctionné parfaitement, merci d'avoir soulagé ma douleur =) –

Questions connexes