ctypes - pointer to pointer to buffer - aber wie?
Verfasst: Dienstag 25. August 2009, 15:22
Hallo zusammen!
Ich versuche aktuell eine .dll einer Digitalkamera mit Python anzusprechen und verwende dazu natürlich ctypes.
Obwohl ich ein totaler Neuling bin was Python angeht, komme ich sehr gut zurecht - bis auf an einer Stelle; und zwar verlangt die .dll Funktion als Parameter einen Pointer auf einen Pointer auf einen Buffer…
Die Funktion erlaubt das aufnehmen und transferieren der Daten einzelner Bilder in den Speicher über diesen Buffer.
Syntax:
Parameter:
HHV hhv; --> Handle to Camera (funktioniert)
BYTE **ppBuffer; --> pointer to pointer to buffer (funktioniert anscheinend nicht)
Int nSum; --> Number of buffers [number of images that have been snapped in memory] (funktioniert)
Beispiel aus der .dll Dokumentation:
Dass der Fehler beim Buffer liegt, habe ich darüber festgestellt, dass andere Kamerafunktionen, die keinen benötigen funktionieren. Meine bisherige Lösung ist offenbar unzureichend und lautet im Moment (für ein Bild, man will sich ja noch steigern können):
Mein Python verabschiedet sich dann mit einer Fehlermeldung (Windows); wenn ich diese ignoriere kann ich noch weiter Befehle an die Kamera senden, sie ist jedoch (nach eigener Aussage) beschäftigt.
Ich vermute, dass das Problem ist, dass ich eigentlich einen Array mit Pointern zu den einzelnen ImageBuffers brauche, den ich via ctypes dann übergeben kann?
Daher drei Fragen:
- Vermute ich richtig?
- Wie mache ich es richtig?
- Gibt es eine Möglichkeit nicht jeden Buffer einzeln an den Array zu übergeben (sagen wir mal, ich wollte einen Film aufnehmen…)
Ich freue mich auf eure Antworten!
Ich versuche aktuell eine .dll einer Digitalkamera mit Python anzusprechen und verwende dazu natürlich ctypes.
Obwohl ich ein totaler Neuling bin was Python angeht, komme ich sehr gut zurecht - bis auf an einer Stelle; und zwar verlangt die .dll Funktion als Parameter einen Pointer auf einen Pointer auf einen Buffer…
Die Funktion erlaubt das aufnehmen und transferieren der Daten einzelner Bilder in den Speicher über diesen Buffer.
Syntax:
Code: Alles auswählen
HVSTATUS __stdcall HVSnapShot(HHV hhv, BYTE **ppBuffer, int nSum)
HHV hhv; --> Handle to Camera (funktioniert)
BYTE **ppBuffer; --> pointer to pointer to buffer (funktioniert anscheinend nicht)
Int nSum; --> Number of buffers [number of images that have been snapped in memory] (funktioniert)
Beispiel aus der .dll Dokumentation:
Code: Alles auswählen
// Snap two images into buffers, buffer size is decided by image resolution
// here assuming a image is 800 * 600
BYTE Buffer1 [800*600]; //Buffer for one image
BYTE Buffer2 [800*600]; //Buffer for another image
Byte *ppBuffer[2]; //This Array keeps the pointer to each buffer
ppBuffer[0] = Buffer1;
ppBuffer[1] = Buffer2;
HVSnapShot(hhv, ppBuffer, 2);
Code: Alles auswählen
## bestimme benötigte Größe pro Bild
buffer_size = 800 * 600 * ctypes.sizeof(ctypes.c_byte)
## belege etwas Platz…
ImageBuffer = ctypes.create_string_buffer(buffer_size)
## rufe die Funktion auf
ctypes.windll.LoadLibrary("HVDAILT").HVSnapShot(hhv, ctypes.byref(ImageBuffer),1)
Ich vermute, dass das Problem ist, dass ich eigentlich einen Array mit Pointern zu den einzelnen ImageBuffers brauche, den ich via ctypes dann übergeben kann?
Daher drei Fragen:
- Vermute ich richtig?
- Wie mache ich es richtig?
- Gibt es eine Möglichkeit nicht jeden Buffer einzeln an den Array zu übergeben (sagen wir mal, ich wollte einen Film aufnehmen…)
Ich freue mich auf eure Antworten!