我正在研究一个需要显示本地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 *";
无论如何要解决这个问题。
提前致谢。
答案 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