2011-12-14 35 views
5

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?

Trả lời

4

Dường như vấn đề là trong các loại AccessibilityContext:

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("WindowsAccessBridge-32.dll", CallingConvention = CallingConvention.Cdecl)] 
public extern static bool getAccessibleContextFromHWND(IntPtr hwnd, out Int32 vmID, out IntPtr acParent); 

AccessibilityContext (acParent ở trên), mà tôi đã ánh xạ không chính xác dưới dạng IntPtr, thực ra là Int32 khi sử dụng thư viện WindowsAccessBridge.dll "cũ" (được sử dụng trong x86) và Int64 khi sử dụng thư viện WOW64 WindowsAccessBridge-32.dll .

Vì vậy, kết quả là, mã khác nhau giữa x86 và WOW x64 và phải được biên dịch riêng cho từng loại. Tôi làm điều này bằng # define'ing WOW64 trong x64 xây dựng, luôn luôn tham khảo các phương pháp Int64, và sử dụng "shim" phương pháp trên x86:

#if WOW64 // using x64 

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("WindowsAccessBridge-32.dll", CallingConvention = CallingConvention.Cdecl)] 
public extern static bool getAccessibleContextFromHWND(IntPtr hwnd, out Int32 vmID, out Int64 acParent); 

#else // using x86 

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("WindowsAccessBridge.dll", EntryPoint = "getAccessibleContextFromHWND", CallingConvention = CallingConvention.Cdecl)] 
private extern static bool _getAccessibleContextFromHWND(IntPtr hwnd, out Int32 vmID, out Int32 acParent); 

public static bool getAccessibleContextFromHWND(IntPtr hwnd, out Int32 vmID, out Int64 acParent) 
{ 
    Int32 _acParent; 

    bool retVal = _getAccessibleContextFromHWND(hwnd, out vmID, out _acParent); 
    acParent = _acParent; 

    return retVal; 
} 

#endif 
+0

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

0

Nếu bạn sử dụng JVM 64 bit với phiên bản 32 bit của cầu truy cập Java, nó sẽ không hoạt động chính xác. Bạn cần phiên bản 64 bit của cây cầu truy cập đã được phát hành gần đây. thấy http://blogs.oracle.com/korn/entry/java_access_bridge_v2_0 Để được hướng dẫn về cách cài đặt một bản sao 32 bit của các cầu truy cập để sử dụng với 32 bit dưới 64 cửa sổ chút JRE xem http://www.travisroth.com/2009/07/03/java-access-bridge-and-64-bit-windows/

+0

Tôi đang sử dụng 2.0.2, và đã thử nghiệm cả 32-bit và 64-bit JVM của thành công: 64-bit JVM với 32-bit JavaMonkey trình 64-bit JVM với 64-bit JavaMonkey làm việc 32 bit JVM với 32-bit JavaMonkey hoạt động Vì vậy, JavaBridge có vẻ hoạt động tốt, từ những gì tôi có thể nói, trong mọi trường hợp – Melllvar

0

Lời kêu gọi 'initializeAccessBridge' đòi hỏi bạn phải có một cửa sổ máy bơm thông điệp tích cực . Bên trong 'initializeAccessBridge', nó (cuối cùng) tạo ra một cửa sổ hộp thoại ẩn (sử dụng CreateDialog). Khi hộp thoại được tạo, hộp thoại sẽ thực hiện PostMessage với thông báo đã đăng ký. Phía JavaVM của cây truy cập phản hồi thông điệp này và gửi lại một thông điệp khác đến hộp thoại đã được tạo (nó có vẻ là một kiểu bắt tay 'hello' giữa ứng dụng của bạn và máy ảo Java).Như vậy, nếu ứng dụng của bạn không có một máy bơm thông báo hoạt động, thông báo trả về từ JavaVM sẽ không bao giờ nhận được bởi ứng dụng của bạn.

+0

Cảm ơn bạn đã trả lời, nhưng lưu ý rằng tôi đã trả lời câu hỏi của chính mình;) – Melllvar

+0

Xin lỗi, tôi đã chiến đấu với chính bản thân mình và điều này làm tôi lo lắng khi tôi thấy nó như là không có tài liệu nói điều này. –

Các vấn đề liên quan