2016-07-13 91 views
0

我正在處理需要顯示安裝在本地Windows機器(64位)中的ODBC驅動程序的java SWT應用程序。我想出了一個可以做到這一點的註冊查詢語句。從32位運行64位Windows命令java

reg query "HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources" /f * 

當我在命令提示符下運行此命令我得到預期的輸出。但是當我從32位Java運行相同的命令時,reg查詢失敗。這裏是示例代碼。

String cmd = "reg query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources\" /f *"; 
     System.out.println(cmd); 
     Process p = Runtime.getRuntime().exec(cmd); 
     BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line; 
     while ((line = in.readLine()) != null) { 
      System.out.println(line); 
     } 

     line = null; 
     BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
     while ((line = err.readLine()) != null) { 
      System.out.println(line); 
     } 

輸出

ERROR: The system was unable to find the specified registry key or value. 

在一些閱讀中,我發現窗戶有註冊表重定向這是防止我的32位Java使用64位註冊表和64位REG.EXE。

我試圖硬編碼system32文件夾中的64位reg.exe的路徑,但它仍然失敗。

String cmd = "C:\\Windows\\System32\\reg.exe query \"HKLM\\SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources\" /f *"; 

無論如何要解決這個問題。

在此先感謝。

+0

從命令行'cmd.exe'殼去掉不必要的行情運行。當直接從Java運行時,引號被留下並且結果參數指定一個不存在的(和無效的)密鑰。 –

+0

@JimGarrison它不是因爲引號。我通過刪除引號再次運行它來檢查它 – kamesh

+0

我嘗試刪除您建議的引號。 'String cmd =「reg query HKLM \\ SOFTWARE \\ ODBC \\ ODBC.INI \\ ODBC Data Sources/f *」;'這次的輸出語法不正確。我厭倦了從HKLM樹中獲得另一個價值,它工作。 'String cmd1 =「reg query \」HKLM \\ HARDWARE \\ DESCRIPTION \\ System \\ CentralProcessor \\ 0 \「/ v ProcessorNameString」;' 根本原因看起來像是java和windows之間的體系結構差異。 – kamesh

回答

1

感謝您的幫助球員。我找到了解決方案。我必須使用sysnative文件夾來訪問32位應用程序中的64位工具。

,所以我更新了我的REQ查詢語句這個

String cmd = "C:\\Windows\\Sysnative\\reg.exe query \"HKLM\\SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources\" /f *"; 

輸出

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources 
jbb REG_SZ IBM Integration (9.0.0.1) - DataDirect Technologies 7.0 64-BIT Oracle Wire Protocol