Tôi có một ứng dụng 32 bit sử dụng khả năng truy cập Java (WindowsAccessBridge-32.dll, qua Cầu truy cập Java) và hoạt động hoàn hảo trên máy 32 bit , nhưng không thành công trên máy x64.Khả năng truy cập Java 32 bit trên máy 64 bit
Tôi tin rằng tôi đã theo dõi nó xuống để một trong những cuộc gọi đầu tiên sau khi Windows_run:
getAccessibleContextFromHWND(hwnd, out vmId, out context)
quy định như sau:
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("WindowsAccessBridge-32.dll", CallingConvention = CallingConvention.Cdecl)]
public extern static bool getAccessibleContextFromHWND(IntPtr hwnd, out Int32 vmID, out IntPtr acParent);
Cuộc gọi này hoạt động tốt trên hệ thống 32-bit, trở về True, điền cả vmId (với giá trị 5 chữ số, trong đó) và ngữ cảnh - trong khi trên hệ thống 64 bit, nó trả về True, điền vào 'context', nhưng trả về '0' cho vmId.
Nếu tôi cho rằng 0 là hợp lệ (mặc dù nó là một con số 5 chữ số ngẫu nhiên giống như một con trỏ trên hệ thống 32-bit), các cuộc gọi tiếp theo vẫn không:
AccessibleContextInfo aci = new API.AccessibleContextInfo();
if (!getAccessibleContextInfo(vmId, context, ref aci))
throw new Exception();
nơi:
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("WindowsAccessBridge-32.dll", CallingConvention = CallingConvention.Cdecl)]
public extern static bool getAccessibleContextInfo(Int32 vmID, IntPtr ac, ref AccessibleContextInfo info);
(Tôi bỏ qua cấu trúc AccessibleContextInfo cho ngắn gọn, nhưng tôi có thể cung cấp nếu cần).
Tôi biết rằng các thư viện đang hoạt động, vì cả JavaMonkey và JavaFerret hoạt động chính xác. Hơn nữa, gọi hàm isJavaWindow, trả về 'true', hoặc 'false' là thích hợp, và tôi liên kết đến đúng DLL (WindowsAccessBridge-32).
Có ai có thể đề xuất điều gì có thể sai ở đây không?
Mỗi AccessibleContext IntPtr phải được thay thế bằng dài, bao gồm nhưng không giới hạn đối với getAccessibleContextFromHWND, getAccessibleParentFromContext, getAccessibleChildFromContext, getAccessibleTextInfo. .. – HelloSam