加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

c# – 64位计算机上的32位Java可访问性

发布时间:2020-12-14 19:17:11 所属栏目:Java 来源:网络整理
导读:我有一个32位应用程序,它使用Java Accessibility(WindowsAccessBridge-32.dll,通过Java Access Bridge),并且在32位计算机上运行完美,但在x64计算机上失败. 我相信我已将其追踪到Windows_run之后的第一个电话: getAccessibleContextFromHWND(hwnd,out vmId,o

我有一个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,填充’context’,但返回vmId为’0′.

如果我假设0是有效的(即使它是一个类似于32位系统上的指针的随机5位数字),下一个调用仍然会失败:

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).

任何人都可以建议这里可能有什么问题?

最佳答案
看来问题出在AccessibilityContext的类型中:

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("WindowsAccessBridge-32.dll",out IntPtr acParent);

AccessibilityContext(上面的acParent),我错误地映射为IntPtr,实际上是使用“旧”WindowsAccessBridge.dll库(在x86下使用)时的Int32,以及使用WOW64 WindowsAccessBridge-32.dll库时的Int64.

结果是,代码必须在x86和WOW x64之间有所不同,并且必须为每个代码单独编译.我在x64版本中通过#defined’ing WOW64执行此操作,始终引用Int64方法,并在x86上使用“shim”方法:

#if WOW64 // using x64

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("WindowsAccessBridge-32.dll",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 acParent);

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

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

  return retVal;
}

#endif

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读