У меня есть 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).
Кто-нибудь может подсказать, что здесь может быть не так?