Frage

Hey! wie Sie vielleicht bemerkt haben, ich habe ein lästiges Problem mit ctypes. Ich versuche, mit einem Instrument zu kommunizieren und zu tun, ich habe ctypes verwenden, um mit dem DLL-Treiber zu kommunizieren.

Bisher habe ich es geschafft, die DLL zu exportieren, indem Sie diese:

>>> 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'

Und es funktioniert ziemlich gut, entsprechend die Dokumentation es soll den Tuner-Treiber-DLL in dem 80-Byte-String als Parameter angegeben speichern. Jedoch wenn ich versuche, um die Funktion zu verwenden, genannt add_tuner es funktioniert nicht. Dies ist, was die Dokumentation sagt:

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[])

Dies ist, wie ich versuchte, die Funktion oben zu nennen: Die Parameter, die geändert werden, sind alle Zeiger und max_range [], gemäß dem Handbuch unter die Werte auch korrekt sind, ich weiß nur nicht, warum ich immer ein Fenster Zugriffsverletzung Schreiben 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))

Die Seriennummer versehen ist jedoch zensiert von einer Variablen beziehen. Jemand weiß, was zu tun ?, haben Sie Fehler mit meinem Eingang sehen?

Danke / Mazdak

War es hilfreich?

Lösung

Ich meine, es ist der Wert, den Sie am long max_range[] Argument übergeben. Die Funktion erwartet einen Zeiger auf eine long ganze Zahl dort (es fragt nach einer Reihe von long ganzen Zahlen), aber Sie vorbei einen langen Wert von Null (Ergebnis der c_long() Call), die implizit gegossen auf einen null-Zeiger. Ich vermute, dass die Funktion dann versucht, die Adresse an max_range, dh übergeben zu schreiben. der Null-Zeiger, damit die Zugriffsverletzung bei Adresse 0x00000000.

auf ein Array von longs erstellen in max_range passieren, zuerst den Array-Typen erzeugen, indem den Array-Datentyp mit der Größe des Arrays Multiplizieren (etwas ausführlichen zur Klarheit):

array_size = 3
ThreeLongsArrayType = c_long * array_size

Sie können dann einen Array instanziiert, wie Sie es mit einer anderen Python-Klasse:

array = ThreeLongsArrayType()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top