2010-11-20 8 views
0

Ich habe ein Problem beim Abrufen von Informationen aus einem Speicherblock, der von der aufgerufenen Funktion zugewiesen wurde. Insbesondere gibt es die Funktion XGetWindowProperties in der X11-Bibliothek, die in JNA enthalten ist. Sie gibt die Ergebnisse über den letzten Parameter - PointerByReference prop_return - zurück.Abrufen eines Arrays über JNA

Ich weiß, dass der tatsächliche Speicherbereich ein Array von Window enthält. Aber wie erstelle ich diese Objekte? Ich sehe keine Möglichkeit, es vom Zeiger selbst zu bekommen und ich kann kein Buffer davon bekommen, da ich die Größe von Window nicht kenne.

Die echte Funktion ist: int XGetWindowProperty(...., unsigned char **prop_return) und mit den Parametern, die ich damit anrufe, ist es eigentlich int XGetWindowProperty(...., Window *prop_return[]).

Antwort

2

Die Größe der Elemente in den zurückgegebenen Daten wird durch das zurückgegebene "Format" von XGetWindowProperty() definiert, mit einer lästigen Ausnahme. Xlib gibt immer Format 32 als ein Array von "long" zurück, auch wenn "long" 64-Bit ist. Fenster hätte Format 32.

In einer schnellen Google-Suche können Sie NativeLong.SIZE verwenden, um dies in JNA zu bestimmen. Also, wenn (NativeLong.SIZE == 8) haben Sie einen Puffer von 64-Bit-Fenster-IDs, sonst von 32-Bit-Fenster-IDs.

Die Byte-Reihenfolge jedes Werts sollte mit der CPU übereinstimmen, auf der Sie sich befinden.

+0

Während dies mein unmittelbares Problem löst, würde ich trotzdem eine allgemeine Lösung sehen wollen: wie man von PointerByReference zu einem Array von bekannten native-mapped Typen geht. – viraptor

+1

Ja, ich kann die JNA-Frage nicht beantworten, nur die Xlib-Frage. fwiw "Window" ist nur eine Integer-ID, es ist kein sinnvolles Objekt. –

1

Sie müssen die Daten zuerst als ein Array primitiver Typen (int oder long wie geeignet) extrahieren. Anschließend können Sie X11.Window-Objekte nach Bedarf mithilfe der XIDs aus dem Array erstellen.

Es ist möglich, um Konverter einrichten, um einige davon automatisch zu behandeln, aber letztlich ist es einfacher für eine einmalige, die Konvertierung explizit zu tun.