Hiho, ich komm einfach mal gleich zur Sache.
Ich habe hier eine DVD/CD Kopierstation und die dazugehörige API. Die Api wird in Form einer Windows dll geliefert und genau die wollte ich nun unter zuhilfenahme von ctypes ansteuern. Der erste Schritt, die Station zu initialisieren ist soweit auch kein Problem, der nächste Schritt jedoch ein gewaltiger. Es soll nun geschaut werden, wieviele Laufwerke mit Robotik an dem System hängen. Dazu gibt es in der der DLL die Funktion
PTRobot_EnumRobots(phRobots, pdwNumRobots)
, welche jedoch, und das ist auch das Problem, als Parameter Variablen vom Typ HANDLE haben möchte, in die sie die gefundenen Robotiken speichern kann.
phRobots: points to an arry of HANDLEs to store the Robots found
pdwNumRobots: points to a DWORD containing the number of HANDLEs in the phRobots array. This value is an input an an output. The user should specify the size (number of HANDLEs) of the phRobots array on input. The value of the pdwNumRobots on output will be the number of robots found.
Die unktion selbst liefert ansonsten nur Fehlercodes zurück, alles was brauchbar ist, wir in die Variablen gespeichert, die man als Parameter übergibt.
Jetzt stellt sich nur die Frage, wie man der Funtion C-Variabeln übergeben kann, die ctypes mir hinterher als Liste, Tupel oder sonstwie wieder zurückgeben kann.
Hat hier schonmal jemand sowas gemacht oder kann mir nen Tipp geben wie ich das am besten angehen kann.
ich habe auch schon bei http://starship.python.net/crew/theller ... orial.html nachgeschaut, jedoch finde ich dort keine Datentypen, die ich hier brauchen könnte (ein Array bestehend aus HANDLEs)
Ich würde mich freuen, wenn mir jemand da weiter helfen könnte.
danke, Aureliusus
Rückgabevariabeln mit ctypes, wie macht man das?
-
- User
- Beiträge: 9
- Registriert: Mittwoch 5. April 2006, 10:23
atm forste ich mich durch http://www.python-forum.de/topic-3560.html
Das scheint in etwa mit dem PRoblem zu tun zu haben. Allerdings hab ich noch immer keine Ahnung wie ich nun so einen Array aus HANDLES anlege, den ich dann an ctypes übergeben kann.
Im Moment bin ich so weit:
Als Antwort bekomme ich dann immer:
Is ja auch Klar, so eine Python Liste kann kein C-Array sein.
Das scheint in etwa mit dem PRoblem zu tun zu haben. Allerdings hab ich noch immer keine Ahnung wie ich nun so einen Array aus HANDLES anlege, den ich dann an ctypes übergeben kann.
Im Moment bin ich so weit:
Code: Alles auswählen
from ctypes import *
clib = cdll.PTRobot
robo = clib.PTRobot_EnumDrives
robo.resttype = c_char_p
array = []
print robo(array,4)
Code: Alles auswählen
print robo(array,4)
ArgumentError: argument 1: exceptions.TypeError: Don't know how to convert parameter 1
Du musst mit `ctypes` einen Arraytyp erzeugen und davon dann ein Objekt an die Funktion übergeben.Aureliusus hat geschrieben:Das scheint in etwa mit dem PRoblem zu tun zu haben. Allerdings hab ich noch immer keine Ahnung wie ich nun so einen Array aus HANDLES anlege, den ich dann an ctypes übergeben kann.
Code: Alles auswählen
In [17]:IntArray10 = ctypes.c_int * 10
In [18]:a = IntArray10()
-
- User
- Beiträge: 9
- Registriert: Mittwoch 5. April 2006, 10:23
Ah, danke, damit hab ich schonmal wieder was dazu gelernt
Allerdings nörgelt das ctypes immer noch mit "TypeError: Don't know how to convert parameter" rum, wenn ich das "Konstrukt" an die Funktion übergebe.
Nun hab ich auf einem anderen REchner heut morgen ActivePYthon installiert und bin dier Doku über folgendes gestolpert:
Ok, klasse, also hab ich folgendes zusammengehämmert
aber auch hier endet das ganze mit "TypeError: Don't know how to convert parameter"
Hat noch jemand ne Idee? Ich bau noch etwas mit Jacks Lösung rum, vielleicht finde ich ja doch noch des Rätsels Lösung
Allerdings nörgelt das ctypes immer noch mit "TypeError: Don't know how to convert parameter" rum, wenn ich das "Konstrukt" an die Funktion übergebe.
Nun hab ich auf einem anderen REchner heut morgen ActivePYthon installiert und bin dier Doku über folgendes gestolpert:
Code: Alles auswählen
pywintypes.HANDLE
PyHANDLE = HANDLE()
Creates a new HANDLE object
Code: Alles auswählen
import pywintypes
from ctypes import *
#die dll laden
clib = cdll.PTRobot
#objekt für die funktion aus der dll anlegen
robo = clib.PTRobot_EnumDrives
#handle anlegen
Feld=pywintypes.HANDLE()
#funktion ausführen
print robo(Feld,4)
Hat noch jemand ne Idee? Ich bau noch etwas mit Jacks Lösung rum, vielleicht finde ich ja doch noch des Rätsels Lösung
Welches Konstrukt? Kannst Du ein wenig Quelltext posten. Du musst natürlich noch herausfinden welchen Typ `HANDLE` nun wirklich hat, das ist ja ein Präprozessor-Makro. Und Du musst laut Deiner API im ersten Post einen Pointer auf so ein Array übergeben und nicht das Array selbst!Aureliusus hat geschrieben:Allerdings nörgelt das ctypes immer noch mit "TypeError: Don't know how to convert parameter" rum, wenn ich das "Konstrukt" an die Funktion übergebe.