Java: как выполнить процесс, который не подключен к консоли Windows? - PullRequest
8 голосов
/ 23 сентября 2011

Оба, Runtime.exec () , а также ProcessBuilder , кажется, присоединяют консоль к запущенному процессу.В Windows 7 в диспетчере задач появляется conhost.exe .Моя проблема сейчас в том, что процесс C, который я пытаюсь запустить, выполняет следующий тест, чтобы определить, есть ли у него окно консоли, для которого он может выдавать запросы:

HANDLE cons = CreateFile("CONOUT$", GENERIC_WRITE,
            FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL, NULL);

if (cons != INVALID_HANDLE_VALUE) {
   // Prompt user; this makes my application hang
}

Возможно ли с помощью Java выполнитьзапустить процесс C таким образом, чтобы тест верхнего уровня не прошел, чтобы избежать запроса?

Ответы [ 3 ]

1 голос
/ 29 сентября 2011

По крайней мере, в OpenJDK 6 CreateProcess вызывается с CREATE_NO_WINDOW .Я полагаю, что код Sun JDK очень похож.Это заставляет меня задуматься, не вызывает ли что-то еще присутствие этой консоли.Вы пытались запустить вашу программу с javaw.exe вместо java.exe?

Думать нестандартно, может быть, JGit - лучший способ решения вашей конкретной проблемы.

0 голосов
/ 27 сентября 2011

Использование Runtime сложно, потому что вам нужно использовать вывод и ввод с потоками. См. Эту статью:

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

Вместо этого попробуйте использовать exec-библиотеку Apache Commons. Вот кое-что, с чего можно начать:

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

0 голосов
/ 26 сентября 2011

Попробуйте:

ProcessBuilder pb = new ProcessBuilder( "cmd", "/C start /B myprogram.exe param1 param2" );

Флаг /B говорит start не создавать новую консоль, хотя я не знаю, будет ли сама start выделять консольпри вызове из Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...