Ich verwende jna.jar, jna-3.2.5.jar und jna-3.3.0-platform.jar in meinem Java-Projekt.
Dies ist die Winapi-Funktion, die ich replizieren möchte.
BOOL WINAPI MagImageScalingCallback(
_In_ HWND hwnd,
_In_ void *srcdata,
_In_ MAGIMAGEHEADER srcheader,
_Out_ void *destdata,
_In_ MAGIMAGEHEADER destheader,
_In_ RECT unclipped,
_In_ RECT clipped,
_In_ HRGN dirty
);
Das ist mein Java-Code
public interface MagImageScalingCallback extends StdCallLibrary.StdCallCallback{
public boolean MagImageScalingCallback(HWND hwnd,
Pointer srcdata,
MAGIMAGEHEADER.ByValue srcheader,
Pointer destdata,
MAGIMAGEHEADER.ByValue destheader,
RectByValue source,
RectByValue clipped,
HRGN dirty);
}
Wenn ich in diese Methode des Rückrufs einsteige, erhalte ich unerwartete Ergebnisse:
public boolean MagImageScalingCallback(HWND hwnd, Pointer srcdata,
MAGIMAGEHEADER.ByValue srcheader, Pointer destdata,
MAGIMAGEHEADER.ByValue destheader, RectByValue source, RectByValue clipped, HRGN dirty) {
image.setRGB(0, 0, srcheader.width, srcheader.height, srcdata.getIntArray(0, srcheader.width * srcheader.height ), 0, srcheader.width);
return true;
}
Diese Tabelle erklärt, was in 32-Bit- und 64-Bit-Systemen funktioniert und was nicht, wenn ich den Datentyp der Variablen ändere.
+--------------+--------------+-------------+-------------+
| Parameter | Data type | 64 bit | 32 bit |
+--------------+--------------+-------------+-------------+
| source | WinDef.RECT | Working | Not Working |
| clipped | WinDef.RECT | Working | Not Working |
| source | RectByValue | Working | Working |
| source | RectByValue | Working | Working |
| srcdata | Pointer | Working | Not Working |
| destdata | Pointer | Working | Not Working |
+--------------+--------------+-------------+-------------+
Nicht funktionieren bedeutet ein komplett schwarzes Bild im Ergebnis
Wenn ich den obigen Code in einem 64-Bit-System verwende, kann ich den Desktop erfassen (ich kann auf die Daten der Pointer-Variable zugreifen). Wenn ich denselben Code in einem 32-Bit-System verwende, erhalte ich kein Bild. Du kannst sehen mein ganzer Code
Warum ist der Fehler in meinem Code? Wie kann ich das beheben?
Für Ihre Information. Wie Sie in der sehen screenSkip.java
, Immer wenn die MagSetWindowSource-Funktion aufgerufen wird. MagImageScalingCallback(in Zeile 80) wird aufgerufen.
Probleme dabei Abschnitt des Codes
Wenn ich diesen Code auf einem 64-Bit-System ausführe srcdata
und destdata
enthält das Array von ganzzahligen Pixeln des Desktops (wenn ich dies als Bild speichere, erfasst es den Desktop). Aber wenn ich denselben Code auf einem 32-Bit-System ausführe, sind diese beiden variablen Array-Pixelwerte immer Null (wenn ich das Bild speichere, ist es immer schwarz).
@david-heffernan Ich führe diesen Code auf einem 32-Bit-System aus. Ich weiss The Magnification API is not supported under WOW64;
. Das bedeutet, dass die 32-Bit-Vergrößerungsanwendung auf einem 32-Bit-System und die 64-Bit-Vergrößerungsanwendung auf einem 64-Bit-System funktioniert. Bitte hören Sie auf zu kommentieren, dass die Vergrößerungs-API unter WOW64 nicht funktioniert, und versuchen Sie, diesen Code auf einem 32-Bit-System auszuführen.
Was Ihre Anfrage betrifft, zeigt das folgende Bild die Konfiguration meines Systems.
Was ist der
C
Redewendung, die Sie zu replizieren versuchen?struct
Handhabung erfolgt durch Verweis (struct *
) für Parameter und nach Wert (struct
) in aggregierten Feldern. Das JavaStructure
Tagging-Schnittstellen (ByValue
,ByReference
) sind dazu da, die komplementäre Konvention zu erzwingen. Alle anderen Werte werden als Wert übergeben und es gibt einen Bereich vonByReference
Implementierungen in dercom.sun.jna.ptr
Paket, um die Übergabe “der Adresse von” eines Werts zu erleichtern.– Technomagier
12. September 2015 um 10:44 Uhr
@technomage Ich habe die Frage aktualisiert. Bitte pingen Sie mich an, wenn Sie es nicht verstanden haben.
– Vishnu
12. September 2015 um 11:19 Uhr
Pointer
wird immer als Wert übergeben. Ob 64- oder 32-Bit, wenn die native Signatur nach einer Struktur nach Wert fragt, müssen Sie sie nach Wert übergeben (es ist nur zufällig, dass die Übergabe einerstruct*
funktionierte zufällig in Ihrem 64-Bit-Fall, da der Compiler mit dem Übergeben von kleinen Werten umgehtstruct
Werte).– Technomagier
12. September 2015 um 13:10 Uhr
@technomage wie kann ich das Problem beheben?
– Vishnu
13. September 2015 um 7:56 Uhr
Wenn Sie die verwenden
SIZE_T
Typ JNA sollte sich um den Größenunterschied kümmern (vorausgesetzt, Sie meinen das cbSize-Feld inMAGIMAGEHEADER
). Aus dem obigen SO-Link würde ich nicht erwarten, dass dies im 32-Bit-Modus unter 64-Bit-Fenstern funktioniert.– Technomagier
18. September 2015 um 11:50 Uhr