我正在尝试使用Java来创建一个启动注册表项,我得到一个非常奇怪的结果.在某些操作系统(如XP)上,命令可以完美运行.但是,在Windows 7上,它只会在运行已编译的jar或类时创建密钥,而不是从网页上的applet运行.此外,在Windows 8上,该命令根本不起作用.我已经尝试过调试它,似乎REG命令正在成功执行.如果我从命令提示符手动运行该命令,它将创建键,其输出与从程序内部运行时的输出相同.下面是代码示例:
public static int regadd(String key, String name, String val) throws IOException, InterruptedException { ProcessBuilder pb = new ProcessBuilder(new String[]{"REG", "ADD", key, "/v", name, "/d", val, "/f"}); pb.redirectOutput(new File(PathManager.getDirectory(), "log0.txt")); int i = pb.start().waitFor(); Logger.log("ADD: " + i); return i; }
在log0.txt中打印:
操作成功完成.
另外,程序的"结果"打印出来
地址:0
所以在这一点上,我不知道可能是什么问题.我知道添加到注册表的其他有趣的方法,但我想保持我的代码与所有VM分发兼容.有没有办法完成这个或修复现有的方法?
我假设您安装了多个Java VM(32位,64位,...),并且根据您执行代码的方式,使用不同的JavaVM,结果不同.
例如,在applet中你通常最终会进入32位Java VM(因为Web浏览器是32位,因此VM也必须是32位).
在这种情况下,我假设也执行了reg.exe的32位versuon.最后写入的所有内容都HKLM\Software
被重定向到HKLM\SOFTWARE\Wow6432Node
(相同的HKCU\Software
- > HKCU\Software\Wow6432Node
).
无论如何,我强烈建议您只是为了监控实际情况.下载并启动Sysinternals ProcessMonitor,只需查找写入注册表的内容即可.然后,您可以确定是否创建了要添加的注册表项,或者是否由于任何虚拟化技术而无法找到它们.
我开发了插件来创建注册表中的密钥.
import javaQuery.core.Registry; import javaQuery.importClass.javaQueryBundle; public class Demo { public static void main(String[] args) { String response = javaQueryBundle.createRegistry().createKey(Registry.HKEY_CURRENT_USER, "\\jqreg", Registry.key_String_Value, "Software", "javaQueryAPI"); System.out.println(response); } }
下载库文件,如果您有任何问题请告诉我.