32-разрядная версия Java Accessibility на 64-разрядной машине

У меня есть 32-битное приложение, которое использует Java Accessibility (WindowsAccessBridge-32.dll, через Java Access Bridge) и отлично работает на 32-битной машине, но не работает на машина x64.

Я полагаю, что отследил это до одного из первых вызовов после Windows_run:

getAccessibleContextFromHWND(hwnd, out vmId, out context)

определено следующим образом:

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

Этот вызов отлично работает в 32-битной системе, возвращает True, заполняя оба vmId (примерно 5 -цифровое значение, которое) и контекст - тогда как в 64-битной системе он возвращает True, заполняет «контекст», но возвращает «0» для vmId.

Если я предполагаю, что 0 действителен (даже если это случайное 5-значное число, напоминающее указатель в 32-битной системе), следующий вызов все равно завершится ошибкой:

AccessibleContextInfo aci = new API.AccessibleContextInfo();
if (!getAccessibleContextInfo(vmId, context, ref aci))
  throw new Exception();

где:

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("WindowsAccessBridge-32.dll", CallingConvention = CallingConvention.Cdecl)]
public extern static bool getAccessibleContextInfo(Int32 vmID, IntPtr ac, ref AccessibleContextInfo info);

(я опускаю структура AccessibleContextInfo для краткости, но я могу предоставить ее при необходимости).

Я знаю, что библиотеки работают, потому что и JavaMonkey, и JavaFerret работают правильно. Кроме того, вызов isJavaWindow работает, возвращая «true» или «false» в зависимости от ситуации, и я связываюсь с правильной DLL (WindowsAccessBridge-32).

Кто-нибудь может подсказать, что здесь может быть не так?

5
задан Melllvar 14 December 2011 в 01:37
поделиться