【问题标题】:How to enable and disable KEY_WOW64_32KEY in Java program如何在 Java 程序中启用和禁用 KEY_WOW64_32KEY
【发布时间】:2017-01-04 05:33:01
【问题描述】:

我有一个 32 位应用程序,它读取注册表并在 HKEY_LOCAL_MACHINE\Software\MyApp\ 中查找值,但在 64 位版本的 Windows 上运行时,该值位于 HKEY_LOCAL_MACHINE\Software\Wow6432Node\MyApp 下。 但我的应用程序仍在 HKEY_LOCAL_MACHINE\Software\MyApp\

中查找值

我正在使用 com.zerog.ia.api.pub.SimpleRegistryManager api 进行注册表操作 该类用于访问Win32系统注册表。

参考 MSDN, KEY_WOW64_32KEY 标志用于从 32 位或 64 位应用程序访问 32 位密钥。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v=vs.85).aspx

使用 Java api 启用或禁用 KEY_WOW64_32KEY 标志的任何方式

【问题讨论】:

  • 也许this 会有所帮助。

标签: java windows registry


【解决方案1】:

我怀疑如果您的程序在 32 位版本的 java.exe 下运行,则无需修改即可运行。能不能在64位系统上运行32位的java.exe,看看能不能用?

我的建议是参考this link,了解如何检测您的程序是在 32 位还是 64 位 VM 下运行。然后更改代码以在 64 位上运行时引用 Wow64 注册表项路径。

我不熟悉您所说的 SimpleRegistryManager 类,但也有可能实现尝试基于 VM 类型传递 KEY_WOW_ 标志并与您真正想要它做的冲突。

对于 Windows 上的开发人员来说,这并不是一个罕见的错误。 (尤其是在 64 位窗口上与各种 32 位和 64 位应用程序互操作时。)有些人采取了一种懒惰的方法。当他们尝试读取注册表项时,如果 HKLM\Software\MyApp 中不存在该注册表项,则代码将退回到尝试从 HKLM\Software\Wow6432Node\MyApp 读取该注册表项。

【讨论】:

  • 是的,我可以在 64 位系统上运行 32 位 java.exe 并运行它。注册表项也保存到 WOW6432Node 中。尝试传递 KEY_WOW_flag 的实现可能是这样,所以在请求密钥之前如何启用 KEY_WOW_flag。是否有任何 Java api 或类似的 Java 方法
  • 如果您的代码检测到它在 64 位 java 上运行,则它请求读取 HKEY_LOCAL_MACHINE\Software\Wow6432Node\MyApp,否则如果在 32 位 java 上发出请求 HKEY_LOCAL_MACHINE\Software\MyApp。这不适合你吗?
  • 问题得到了解决,在我的应用程序的最后一个版本中,我使用 32 位安装程序构建了它,但我不小心使用了 JRE 64 位而不是 JRE 32 位,因此引发了问题。今天我用 JRE 32 位重建了它,现在它可以正常工作了感谢@selbie 提供的信息,它帮助我找到了路由问题的原因。
猜你喜欢
  • 2015-05-21
  • 2013-02-09
  • 2012-09-29
  • 2022-01-02
  • 2015-02-12
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多