Использование ShellExecuteEx и получение стандартного in / out / err - PullRequest
9 голосов
/ 22 января 2009

Я использую ShellExecuteEx для выполнения команды в C. Есть ли способ использовать ShellExecuteEx и захватить стандартный ввод / вывод / ошибка?

Примечание: я не хочу использовать CreateProcess.

Ответы [ 5 ]

6 голосов
/ 02 марта 2009

Я использую, чтобы найти проблему, как вы.

Предположим, вы хотите перехватить вывод из STDOUT, сгенерированный командой dir , и сохранить перехваченный файл в out.txt .

  1. Используйте текстовый редактор и введите dir> out.txt и сохраните его с помощью mybat.bat (* .bat, not * .txt)

  2. В вашей программе c / c ++ введите WinExec ("mybat.bat", SW_HIDE); и запустите ваше приложение.

  3. Откройте out.txt , вы увидите имена папок и файлов в текущем каталоге.

Кроме того, вы можете запускать любые исполняемые файлы (* .exe) так же, как указано ниже.

xxx.exe> ​​out.txt

Надеюсь, это поможет вам. Извините, мой английский действительно не очень хороший.

4 голосов
/ 22 января 2009

Нет. Единственный способ сделать это - использовать CreatePipe и CreateProcess. См. Статью MSDN здесь

4 голосов
/ 22 января 2009

Это невозможно. ShellExecute (Ex) в основном выполняет приложение в контексте оболочки - так что вы в основном делаете то, что делает проводник.

Захват STDIN и STDOUT - это то, что оболочка обычно не делает, вам придется идти по маршруту CreateProcess (который, в конце концов, и есть то, что ShellExecute в конце концов вызывает, если файл для выполнения является программой и глагол «открытый»).

2 голосов
/ 23 января 2009

Как уже упоминали Пилиф и Боб, вам нужно использовать CreateProcess.

Если вам нужен код, который завершает все это для вас, у меня есть класс для этой проблемы по адресу:

http://code.google.com/p/kgui/source/browse/trunk/kguithread.cpp.

Класс (kGUICallThread) обрабатывает версии для Linux, macOS и Windows. Код лицензирован LGPL.

1 голос
/ 30 ноября 2009

CreateProcess - это то, что использует большинство людей.

Вы также можете рассмотреть возможность использования _popen

http://msdn.microsoft.com/en-us/library/96ayss4b%28VS.80%29.aspx

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