У меня есть 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-битномsystem, возвращая True, заполняет как vmId (с некоторым 5-значным значением, которое), так и context - тогда как в 64-битной системе он возвращает True, заполняет «context», но возвращает «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).
Может кто-нибудь подсказать, что здесь может быть не так?