2016-04-24 75 views
1

我試圖從我的Java應用程序更改註冊表值。我用命令:使用getRuntime()更改註冊表項的值exec(cmd)不會更改註冊表值,即使操作已成功結束

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); 
     } 
    } 

一切正常o凱。我得到的輸出到命令提示符:

操作成功完成

於是我開始註冊表編輯器以驗證是否值已更改,但讓我吃驚的什麼都沒有改變。該值與以前相同。

我有權限嗎?是
我使用批處理文件執行我的應用程序以管理員身份運行

批處理文件:

cd %~dp0 
java -jar LoudnessEqualizationToggle.jar 
pause 

從創建快捷方式,並以管理員身份運行。

您是該密鑰的擁有者嗎?是

我使用批處理文件測試了我的命令和權限,如果Windows註冊表中的當前值0可以按預期更改爲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應用程序中從運行時執行程序運行我的命令時,在Windows註冊表中沒有更改任何值,但我看到命令執行沒有問題。在我的Java調試中,我看到了與批處理文件中執行的命令完全相同的命令。

什麼可能是由我的Java應用程序內執行的reg.exe命令更改註冊表值的原因?

進程監視器畫面(由漁業部的前端之後):

Process Monitor log with filter set to include all registry access with MMDevices in path

回答

2

在進程監視器日誌WOW6432Node表示Java代碼與32位Java在32位的環境在Windows上執行64。因此被調用的reg.exe也是32位%SystemRoot%\SysWOW64\reg.exe,因此修改了WOW6432Node中的DWORD值。

有關Windows的詳細微軟的文章在Windows上:

一個解決方案爲32位和64位Java工作在32位和64位Windows上將是:

  1. 獲取環境變量的字符串值SystemRoot

  2. 檢查文件SystemRoot + "\\Sysnative\\reg.exe"是否存在。

    這僅限於在Windows x64上執行的32位Java的情況。在所有其他情況下,即Windows x64上的64位Java或Windows x86上的32位Java,此文件不存在,因爲Sysnative不存在。是的,Sysnative不適用於Windows x64上的64位應用程序。

  3. 如果文件reg.exe存在於Windows目錄中的Sysnative中,請致電SystemRoot + "\\Sysnative\\reg.exe"

  4. 否則請致電SystemRoot + "\\System32\\reg.exe"這是Windows x64上的64位Java以及Windows x86上的32位Java的正確可執行文件。