2009-06-15 8 views
0

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

Antwort

3

ich kapier der Wert, den Sie am long max_range[] Argument übergeben ist. Die Funktion erwartet einen Zeiger auf eine Ganzzahl long dort (es fragt nach einem Array von long Ganzzahlen), aber Sie übergeben einen langen Wert von Null (Ergebnis der c_long() Aufruf), die implizit auf einen Nullzeiger umgewandelt wird. Ich vermute, die Funktion versucht dann auf die Adresse max_range zu schreiben, dh. der Nullzeiger, daher die Zugriffsverletzung bei Adresse 0x00000000.

Um ein Array von long s zu schaffen in max_range zu passieren, müssen Sie zunächst durch Multiplikation des Array-Datentypen mit der Größe des Arrays (etwas weitschweifig für Klarheit), um den Array-Typen erstellen:

array_size = 3 
ThreeLongsArrayType = c_long * array_size 

Sie können Dann instanziieren Sie ein Array wie mit jeder anderen Python-Klasse:

array = ThreeLongsArrayType() 
+0

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 –

+0

Ich fügte eine Erklärung dazu, wie das zu meiner Antwort :) – Steef

+0

Vielen Dank! es hat perfekt funktioniert, danke, dass du meinen Schmerz gemildert hast =) –

Verwandte Themen