Buffer reservieren + Pointer auslesen
Also, das mit den Pointern geht so:
Du initialisierst ein 1D-Array mit der Größe BxHxBit/8, drahtest dieses an den Eingang des Pointers des DLL-Aufrufs an und stellst als Typ "Array, U8, Array Data Pointer" ein.
Das funktioniert bei einer dll in einem Projekt von mir, die was ganz ähnliches macht (Ein Bild einer kamera in einen per zeiger übergebenen Speicherbereich schreiben) ganz gut.
Meine Anschlussfrage ist nun allerdings:
Meine dll muss 2 Mal aufgerufen werden: Beim ersten Mal wird die Anfangsadresse des allokierten Speichers übergeben, Funktion:
INT is_SetAllocatedImageMem (HIDS hf, INT width, INT height, INT bitspixel, char* pcImgMem, int* pid)
beim zweiten Mal wird dieser Speicher an einen Ringpuffer angehängt:
INT is_AddToSequence (HIDS hf, char* pcImgMem, INT nID)
Der zweite Teil funktioniert nun leider nur beim 1. Durchlauf einer Schleife. Ab dem 2. Aufruf klappt es nicht mehr, es wird ein Fehlercode aus der dll zurückgegeben. Und zum debuggen würde ich nun gern sehen, on mglw. beim 2. Aufruf die selbe Speicheradresse übergeben wurde. Dann könnte ich verstehen, daß die Ringpuffer-Funktion da meckert.
Das verrückte ist noch: Mache ich den 2. Aufruf nicht in einer Schleife, sondern einfach durch eine nachgeschaltete Kopie der beiden Aufrufe, dann funktioniert es! Verrückt.
Ich muss aber leider ca. 90 Frames allokieren, und kann/will diese beiden Funktionen nicht neunzigmal hintereinander kopieren.
Wie kann man sich denn also die tatsächliche Speicheradresse ausgeben lassen, die der dll übergeben wird? Damit könnte ich das mal überprüfen, ob die Crux schon beim Allokieren liegt.
Es gibt nun darüberhinaus noch eine weitere Funktion der dll:
INT is_AllocImageMem (HIDS hf, INT width, INT height, INT bitspixel, char** ppcImgMem, INT* pid)
Damit wird der Speicher dll-intern selbst allokiert. Ausgegeben wird hier nun wiederum die Speicheradresse. Diese bekomme ich diesmal allerdings nicht als Array-Pointer, sondern in den ersten 4 Stellen IM Array. Da wäre nun die Frage andersherum: Wie mache ich aus dieser Rückgabe wieder einen Pointer, um diesen der Ringpuffer-Funktion zu übergeben?
Danke schonmal für alle Hinweise.
Ich arbeite übrigens mit einer ueye-Kamera von ids-imaging. Hat jemand vielleicht sogar speziell mit deren dlls und LabVIEW Erfahrungen?
|