Перейти к содержанию
    

Borland c++ ShellExecute()

Есть вопрос сугубо 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно проще. Запускать шеллом батник.

"Ping > answer.txt"

Весь вывод уйдет в файл.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть вопрос сугубо PC-программерский.

 

ShellExecute() позволяет выполнять любые консольные команды. А вот как получать ответ этих команд?

К примеру я выполняю Ping c помощью ShellExecute. При этом в окошке Ping пишет доступен или нет такой-то адрес.

А как с помощью программы прочитать то что ответил этот пинг?

В аттачменте - программа с асинхронным чтением данных с выхода процесса (пригодится при зависающих программах).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы.

 

А как обычно определяют конец передачи по Pipe? Я сейчас жду окончания процесса, и затем читаю Pipe. Но он подвисает во время чтения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я когда-то давно запускал ассемблер писаный для дос из дельфей.

Если после команды дос или cmd поставить знак ">" это означает перенаправление вывода в файл (или устройство).

Также можно и перенаправить ввод значком <.

Окончание работы программы определяется по появлению нужного файла... Работает железно. А самое главное - будет работать под любой ОС.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за советы. Разобрался уже. Чтобы не подвисало надо перед чтением делать CloseHandle для Pipe c той стороны. Иначе, если вызванный процесс завершился, и попробовать выполнять ReadFile, то он будет до бесконечности ждать ввода с той стороны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А самое главное - будет работать под любой ОС.

А вот это как раз вряд-ли. Это какая-то "дырка" запуска через шелл винды, позволяющая чисто cmd-шной фичи (в виде значков перенаправления) выполняться. В других ОС скорее всего вообще такого понятия "запуск через шелл" нет. А вот переназначение stdin/stdout/stderr и трубы (Pipes) есть во всех ОС, в которых есть сам stdin/stdout

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зато во всех есть ">". Под всеми - имеются ввиду 2 ОС, которые существуют на планете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зато не везде есть права на создание файлов. И вообще где их создавать нету.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...