Полная версия этой страницы:
Borland c++ ShellExecute()
Amper25
Jun 26 2009, 18:29
Есть вопрос сугубо PC-программерский.
ShellExecute() позволяет выполнять любые консольные команды. А вот как получать ответ этих команд?
К примеру я выполняю Ping c помощью ShellExecute. При этом в окошке Ping пишет доступен или нет такой-то адрес.
А как с помощью программы прочитать то что ответил этот пинг?
Используйте вместо ShellExecute CreateProcess. там в lpStartupInfo можно передать свои хэндлы stdin, stdout и stderr. А в эти хэндлы указать пайпы (pipes). В общем - голимый RTFM:
http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx
DpInRock
Jun 26 2009, 19:33
Можно проще. Запускать шеллом батник.
"Ping > answer.txt"
Весь вывод уйдет в файл.
Genadi Zawidowski
Jun 27 2009, 16:43
Цитата(Amper25 @ Jun 26 2009, 22:29)

Есть вопрос сугубо PC-программерский.
ShellExecute() позволяет выполнять любые консольные команды. А вот как получать ответ этих команд?
К примеру я выполняю Ping c помощью ShellExecute. При этом в окошке Ping пишет доступен или нет такой-то адрес.
А как с помощью программы прочитать то что ответил этот пинг?
В аттачменте - программа с асинхронным чтением данных с выхода процесса (пригодится при зависающих программах).
Amper25
Jun 29 2009, 15:57
Спасибо за ответы.
А как обычно определяют конец передачи по Pipe? Я сейчас жду окончания процесса, и затем читаю Pipe. Но он подвисает во время чтения.
DpInRock
Jun 30 2009, 09:51
Я когда-то давно запускал ассемблер писаный для дос из дельфей.
Если после команды дос или cmd поставить знак ">" это означает перенаправление вывода в файл (или устройство).
Также можно и перенаправить ввод значком <.
Окончание работы программы определяется по появлению нужного файла... Работает железно. А самое главное - будет работать под любой ОС.
Amper25
Jun 30 2009, 12:49
Спасибо за советы. Разобрался уже. Чтобы не подвисало надо перед чтением делать CloseHandle для Pipe c той стороны. Иначе, если вызванный процесс завершился, и попробовать выполнять ReadFile, то он будет до бесконечности ждать ввода с той стороны.
Цитата(DpInRock @ Jun 30 2009, 13:51)

А самое главное - будет работать под любой ОС.
А вот это как раз вряд-ли. Это какая-то "дырка" запуска через шелл винды, позволяющая чисто cmd-шной фичи (в виде значков перенаправления) выполняться. В других ОС скорее всего вообще такого понятия "запуск через шелл" нет. А вот переназначение stdin/stdout/stderr и трубы (Pipes) есть во всех ОС, в которых есть сам stdin/stdout
DpInRock
Jul 1 2009, 05:24
Зато во всех есть ">". Под всеми - имеются ввиду 2 ОС, которые существуют на планете.
Зато не везде есть права на создание файлов. И вообще где их создавать нету.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.