По адресу http://www.msjogren.net/dotnet/eng/samples/vb6_cmdoutput.asp лежим симпатичный примерчик (Sample2.exe) запуска ДОС-приложения с выводом всего в TextBox. Он прекрасно работает, только если приложение ничего не ждёт с клавиатуры. Т.е. BAT-файл @Echo off dir
обрабатывается прекрасно. Но добавьте в его конец строчку "pause" - и программа зависнет.
То же самое будет, если ввести команду "dir a:", когда в дисководе ничего нет (и по идее, на экране высвечивается "Устройство не готово..." и т.д., с предложением нажать A или R или F).
Вот такая беда... Как бы это обойти? Я запускаю (через CreateProcess, с флагом SW_HIDE) DOS-приложение, которое вполне может сделать запрос пользователю (в критичных ситуациях). Я не прочь "чёрного окошка" в данном случае - однако, мне надо обязательно перехватывать вывод этой программы в stdout, поскольку то, что она выводит на экран, - это по сути Журнал её работы, со всеми нужными мне мессаджами. По-другому она вести Журнал не умеет (нету и неё ключа /log или чего-то в этом роде, увы). Для перехвата я не знаю другого метода, кроме "anonymous pipes" (как в упомянутом выше примере из Сети), а они работают через ReadFile, которая "вешается" наглухо, если ДОСовская прога ждёт ввода с клавиатуры.
Ответить
|