2016-07-13 9 views
0

Я работаю над Java SWT-приложением, которое должно показать драйверы ODBC, установленные на локальной машине Windows (64 бит). Я придумал инструкцию reg query, которая сделает это.Запуск 64-битной оконной команды из 32-битного 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.

Я пытался жестко установить путь для 64-битного reg.exe в папке system32, но он все еще не работает.

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 Источники данных/f * ";' Выход на этот раз является неправильным синтаксисом. Я устал от доступа к другому значению из дерева HKLM, и он сработал. 'String cmd1 =" reg query \ "HKLM \\ HARDWARE \\ ОПИСАНИЕ \\ System \\ CentralProcessor \\ 0 \"/v ProcessorNameString ";' Основная причина выглядит как разница в архитектуре между java и windows. – kamesh

ответ

1

спасибо за помощь, ребята. Я нашел решение. Я должен использовать sysnative папку для доступа к 64-битным инструментам из 32-разрядного приложения.

так я обновил свое заявление 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