Javaプロジェクトでjna.jar、jna-3.2.5.jar、jna-3.3.0-platform.jarを使用しています。JNAを使用して `MagImageScalingCallback`を正しくマッピングするにはどうすればよいですか?
これは私が複製したいWinapiの機能です。
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
);
私はコールバックのこのメソッドに入るときは、この私のJavaコード
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);
}
は、私が予期しない結果を得るされています
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;
}
この表は「doesnの何動作し、何を説明変数のデータ型を変更すると、32ビットと64ビットのシステムで動作します。
+--------------+--------------+-------------+-------------+
| 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 |
+--------------+--------------+-------------+-------------+
が動作していない私は、64ビットシステムで上記のコードを使用する場合、私はデスクトップをキャプチャすることができ
結果で完全に黒画像を意味する(Iからのデータにアクセスすることができますポインタ変数)。私が32ビットシステムで同じコードを使用すると、私はイメージを取得していません。あなたが見ることができますmy whole code
なぜ私のコードのエラーですか?どうすれば修正できますか?
あなたの情報をお寄せください。 screenSkip.java
にあるように、MagSetWindowSource関数が呼び出されたときはいつでも。 MagImageScalingCallback(80行目)が呼び出されます。このsection of code
で
問題Iが64ビットシステムsrcdata
とdestdata
にこのコードを実行するデスクトップの整数画素のアレイを保持する(Iは画像としてこれを保存した場合、それはデスクトップをキャプチャ)。しかし、32ビットシステムで同じコードを実行すると、これらの両方の可変配列ピクセル値は常にゼロになります(画像を保存すると、常に黒です)。 [2] ] [2]
Iが32ビットシステム上でこのコードを実行しています。私はThe Magnification API is not supported under WOW64;
を知っています。つまり、32ビットシステムでは32ビットの倍率アプリケーションが動作し、64ビットシステムでは64ビットの倍率アプリケーションが機能します。 WOW64で倍率APIが動作しないことをコメントして、このコードを32ビットシステムで実行しようとしてください。
お客様のご要望に応じて、下の画像は私のシステムの構成を示しています。
あなたが複製しようとしている 'C'イディオムとは何ですか?'struct'の扱いは、パラメータの参照(' struct * ')と集約フィールドの値(' struct')によるものです。 Javaの 'Structure'タグインターフェース(' ByValue'、 'ByReference')は、補完的な慣習を強制するものです。他のすべての値は値渡しされ、 'com.sun.jna.ptr'パッケージに' ByReference'実装の範囲が存在し、値のアドレスを渡すことを容易にします。 – technomage
@technomage質問を更新しました。あなたが理解できなかったら私にpingしてください。 – Vishnu
'Pointer'は常に値によって渡されます。 64ビットであれ32ビットであれ、ネイティブシグネチャが値によって構造体を要求する場合は、それを値渡しする必要があります(64ビットの場合、 'struct * 'を渡すことは偶然に起こりました。コンパイラが小さな 'struct'値を渡す方法)。 – technomage