Tôi đang sử dụng jna.jar, jna-3.2.5.jar và jna-3.3.0-platform.jar trong Dự án Java của tôi.Làm cách nào để ánh xạ chính xác `MagImageScalingCallback` bằng JNA?
Đây là hàm Winapi mà tôi muốn sao chép.
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
);
Đây là mã Java của tôi
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);
}
Khi tôi nhận được vào phương pháp này gọi lại, tôi nhận được kết quả bất ngờ:
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;
}
bảng này giải thích gì làm việc và những gì doesn' t làm việc trong hệ thống 32 bit và 64 bit khi tôi thay đổi kiểu dữ liệu của các biến.
+--------------+--------------+-------------+-------------+
| 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 |
+--------------+--------------+-------------+-------------+
Không làm việc có nghĩa là một hình ảnh hoàn toàn đen trong kết quả
Nếu tôi sử dụng đoạn mã trên trong một hệ thống 64 bit, tôi có thể chụp màn hình (Tôi có thể truy cập dữ liệu từ Biến con trỏ). Nếu tôi sử dụng cùng một mã trong hệ thống 32 bit, tôi không nhận được bất kỳ hình ảnh nào. Bạn có thể xem my whole code
Tại sao lỗi trong mã của tôi? Lam sao tôi co thể sửa no?
Để biết thông tin của bạn. Như bạn thấy trong screenSkip.java
, Bất cứ khi nào hàm MagSetWindowSource được gọi. MagImageScalingCallback (trong dòng 80) được gọi.
Vấn đề ở đây section of code
Nếu tôi chạy mã này trên một hệ thống 64 bit srcdata
và destdata
sẽ tổ chức tập hợp các điểm số nguyên của máy tính để bàn (Nếu tôi tiết kiệm này như hình ảnh, nó chụp màn hình). Nhưng nếu tôi chạy cùng một mã trên hệ thống 32 bit, cả hai giá trị mảng mảng biến đều luôn bằng không (Nếu tôi lưu hình ảnh, nó luôn luôn là màu đen)
Hệ thống 64 bit [! [Enter image description here] [2 ]] [2]
@ david-Heffernan tôi đang chạy mã này trên một hệ thống 32-bit. Tôi biết The Magnification API is not supported under WOW64;
. Điều này có nghĩa là ứng dụng phóng đại 32 bit hoạt động trên hệ thống 32 bit và ứng dụng phóng đại 64 bit hoạt động trên hệ thống 64 bit. Vui lòng ngừng nhận xét rằng API phóng đại không hoạt động trên WOW64 và cố gắng thực thi mã này trên hệ thống 32 bit.
Đối với yêu cầu của bạn, hình ảnh bên dưới hiển thị cấu hình của Hệ thống của tôi.
'cái C' ngữ bạn đang cố gắng để tái tạo là gì?Xử lý 'struct' là tham chiếu (' struct * ') cho các tham số và theo giá trị (' struct') trong các trường tổng hợp. Các giao diện gắn thẻ 'Structure' của Java (' ByValue', 'ByReference') có sẵn để bắt buộc quy ước bổ sung. Tất cả các giá trị khác được truyền theo giá trị và tồn tại một loạt các triển khai 'ByReference' trong gói' com.sun.jna.ptr' để tạo thuận lợi cho việc truyền "địa chỉ của" một giá trị. – technomage
@technomage Tôi đã cập nhật câu hỏi. Vui lòng ping cho tôi nếu bạn không hiểu. – Vishnu
'Con trỏ' luôn được truyền theo giá trị. Cho dù 64- hoặc 32-bit, nếu chữ ký gốc yêu cầu một struct theo giá trị, bạn cần truyền nó theo giá trị (chỉ có khả năng là đi qua một 'struct *' đã xảy ra để làm việc trong trường hợp 64-bit của bạn, do cách trình biên dịch xử lý các giá trị 'struct' nhỏ. – technomage