Rückgabevariabeln mit ctypes, wie macht man das?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Aureliusus
User
Beiträge: 9
Registriert: Mittwoch 5. April 2006, 10:23

Rückgabevariabeln mit ctypes, wie macht man das?

Beitragvon Aureliusus » Dienstag 6. Juni 2006, 14:18

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 :)
Aureliusus
User
Beiträge: 9
Registriert: Mittwoch 5. April 2006, 10:23

Beitragvon Aureliusus » Dienstag 6. Juni 2006, 14:25

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:
[code=]

from ctypes import *
clib = cdll.PTRobot
robo = clib.PTRobot_EnumDrives
robo.resttype = c_char_p
array = []
print robo(array,4)

[/code]
Als Antwort bekomme ich dann immer:

[code=] print robo(array,4)
ArgumentError: argument 1: exceptions.TypeError: Don't know how to convert parameter 1[/code]

Is ja auch Klar, so eine Python Liste kann kein C-Array sein.
BlackJack

Beitragvon BlackJack » Mittwoch 7. Juni 2006, 07:25

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.


Du musst mit `ctypes` einen Arraytyp erzeugen und davon dann ein Objekt an die Funktion übergeben.

Code: Alles auswählen

In [17]:IntArray10 = ctypes.c_int * 10

In [18]:a = IntArray10()


Jetzt ist `a` ein Array, das genug Speicher für 10 `c_int` reserviert hat. Das Problem ist, das `HANDLE` kein C Datentyp ist, Du musst also herausfinden was das eigentlich ist. Eine Zahl, ein Pointer oder vielleicht sogar eine Struktur und dann entsprechend ein Array mit `ctypes` konstruieren.
Aureliusus
User
Beiträge: 9
Registriert: Mittwoch 5. April 2006, 10:23

Beitragvon Aureliusus » Mittwoch 14. Juni 2006, 14:56

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:
[code=]

pywintypes.HANDLE
PyHANDLE = HANDLE()

Creates a new HANDLE object

[/code]

Ok, klasse, also hab ich folgendes zusammengehämmert

[code=]
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)
[/code]

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 :lol:
BlackJack

Beitragvon BlackJack » Mittwoch 14. Juni 2006, 15:27

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.


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!

Wer ist online?

Mitglieder in diesem Forum: brainstir