从32位java运行64位Windows命令

时间:2016-07-13 20:02:59

标签: java windows registry 32bit-64bit runtime.exec

我正在研究一个需要显示本地Windows机器(64位)中安装的ODBC驱动程序的java SWT应用程序。我提出了一个reg查询语句,它会这样做。

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.

经过一些阅读,我发现Windows有注册表重定向,这阻止了我的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 *";

无论如何要解决这个问题。

提前致谢。

1 个答案:

答案 0 :(得分: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