我正在尝试从Java应用程序更改注册表值。我使用以下命令:
LoudnessEqualizationToggle.execCmdNoReturn("reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\Render\\"+guid+"\\FxProperties\""
+ " /f /v \"{E0A941A0-88A2-4df5-8D6B-DD20BB06E8FB},4\" /t REG_DWORD /d \""+((activateLEOnKey) ? 1 : 0)+"\"");
guid为{d348b8e8-3118-4a9c-9b43-422647b555ca}
activateLEOnKey是布尔值
execCmdNoReturn函数:
public static final void execCmdNoReturn(String cmd) {
try {
Scanner s = new Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");
System.out.println("Command:"+cmd);
System.out.println("Printing executed data");
while (s.hasNext()) {
System.out.println(s.next());
}
} catch (IOException ex) {
Logger.getLogger(LoudnessEqualizationToggle.class.getName()).log(Level.SEVERE, null, ex);
}
}
一切正常。我得到输出到命令提示符:
操作成功完成
因此,我开始regedit来验证价值是否已更改,但令我惊讶的是,没有任何更改。该值与以前相同。
我有权限吗?是的,
我使用批处理文件通过“以管理员身份运行”来执行我的应用程序。
批处理文件:
cd %~dp0
java -jar LoudnessEqualizationToggle.jar
pause
从中创建快捷方式并以管理员身份运行。
您是该密钥的所有者吗?是的
我是否使用批处理文件测试了命令和权限,因此是否0
可以将Windows注册表中的当前值更改1
为预期的值。
该测试的批处理文件为:
cd %~dp0
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{d348b8e8-3118-4a9c-9b43-422647b555ca}\FxProperties" /f /v "{E0A941A0-88A2-4df5-8D6B-DD20BB06E8FB},4" /t REG_DWORD /d "1"
net stop audiosrv //just restarting audio down here , not important
net stop AudioEndpointBuilder
net start audiosrv
net start AudioEndpointBuilder
pause
批处理文件执行后,Windows注册表中的值已从0更改为1(所需操作)。
因此,当我直接从命令提示符窗口运行命令时,可以看到该值已更改。但是,当我从Java应用程序中的运行时exec运行命令时,尽管我看到命令执行没有问题,但Windows注册表中的值没有更改。在我的Java调试中,我看到与批处理文件中执行的命令完全相同。
从我的Java应用程序中执行的reg.exe命令未更改注册表值的原因可能是什么?
过程监视器屏幕(在Mofi提示之后):
WOW6432Node
“进程监视器”的日志中的表示Java代码是在64位Windows的32位环境中使用32位Java执行的。因此,被调用reg.exe
的也是32位%SystemRoot%\SysWOW64\reg.exe
,因此会修改中的DWORD值WOW6432Node
。
Microsoft文章,其中包含有关Windows on Windows的详细信息:
在32位和64位Windows上适用于32位和64位Java的一种解决方案是:
获取环境变量的字符串值SystemRoot
。
检查文件是否SystemRoot + "\\Sysnative\\reg.exe"
存在。
只有在64位Windows上执行的32位Java才是这种情况。在所有其他情况下,例如64位Windows上的64位Java或32位Windows上的32位Java,此文件不存在,因为Sysnative
不存在。是的,Sysnative
对于64位Windows上的64位应用程序不存在。
如果该文件reg.exe
存在于Sysnative
Windows目录中,请调用SystemRoot + "\\Sysnative\\reg.exe"
。
否则,调用SystemRoot + "\\System32\\reg.exe"
64位Windows上64位Java和32位Windows上32位Java正确的可执行文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句