Jump to content

    
Sign in to follow this  
Amper25

Borland c++ ShellExecute()

Recommended Posts

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

 

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

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

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

Share this post


Link to post
Share on other sites

Используйте вместо ShellExecute CreateProcess. там в lpStartupInfo можно передать свои хэндлы stdin, stdout и stderr. А в эти хэндлы указать пайпы (pipes). В общем - голимый RTFM: http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx

Share this post


Link to post
Share on other sites
Есть вопрос сугубо PC-программерский.

 

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
А самое главное - будет работать под любой ОС.

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this