Hey! Wie Sie vielleicht bemerkt haben, habe ich ein nerviges Problem mit Ctypes. Ich versuche, mit einem Instrument zu kommunizieren, und dazu muss ich Ctypes verwenden, um mit dem DLL-Treiber zu kommunizieren.Ctypes in Python, Problem beim Aufruf einer Funktion in einer DLL
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 der Dokumentation es soll die Tuner-Treiber-DLL in der 80-Byte-String speichern gegeben als ein Parameter. Wenn ich jedoch versuche, die Funktion add_tuner zu verwenden, schlägt es fehl. 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[])
das ist, wie ich versuchte, über die Funktion aufzurufen: Die Parameter, die geändert werden, sind alle Zeiger und max_range [], gemäß dem Handbuch die Werte unten sind zu korrigieren , ich weiß nur nicht, warum ich eine Fenster Zugriffsverletzung erhalte 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 wird jedoch durch beziehen auf eine Variable zensiert gegebene schreiben. Jemand weiß, was zu tun ist?, Sehen Sie irgendwelche Fehler mit meiner Eingabe?
Dank /Mazdak
Ow! das ist wahr!, total vermisst, das muss es sein. Wie deklariere ich ein Array mit c_long() s? Ist ArrayLong = c_long() * 3? Ursache, wenn ich c_long zu arrayLong ändern sagt es, dass es nicht wissen, wie Parameter 7 (ctypes.argumentError) zu konvertieren –
Ich fügte eine Erklärung dazu, wie das zu meiner Antwort :) – Steef
Vielen Dank! es hat perfekt funktioniert, danke, dass du meinen Schmerz gemildert hast =) –