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
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) –
J'ai ajouté une explication sur la façon de faire cela à ma réponse :) – Steef
Merci! ça a fonctionné parfaitement, merci d'avoir soulagé ma douleur =) –