Если у меня есть консольная программа Windows, написанная на С++, можно ли получить стандартный вывод этой программы во время работы программы? А если нет, то как лучше переписать программу? Я знаю, что могу выводить в файлы и постоянно проверять эти файлы на наличие обновлений. Есть ли другой способ? Есть ли способ лучше?
Можно ли получить вывод программы во время ее работы?
Ответы (5)
В Code Project есть несколько интересных статей:
- CommandLineHelper (C#)
- Перенаправление произвольного ввода/вывода консоли (MFC/C++)
- Универсальный перенаправитель консоли (MFC/C++)
Да, если вы запускаете программу самостоятельно:
в CreateProcess вы передаете STARTUPINFO, где можно указать дескрипторы для SDIN, STDOUT и STDERR. . Обратите внимание, что вам необходимо указать все три, как только вы укажете флаг STARTF_USESTDHANDLES
.
Кроме того, дескрипторы должны быть наследуемыми (иначе дочерний процесс не сможет получить к ним доступ), поэтому SECURITY_ATTRIBUTES в основном должен выглядеть как минимум так:
SECURITY_ATTRIBUTES secattr = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
Вы можете открывать дескрипторы дисковых файлов, которые содержат ввод и получают вывод. Кроме того, это могут быть каналы, которые можно чтение/запись постепенно во время работы консольного приложения.
Если это готовый исполняемый файл консоли, вы всегда можете перенаправить его вывод в такой файл:
c:> echo Какой-то текст > файл
or
c:> программа> файл
Если вы имеете в виду это? Поскольку ваш вопрос не совсем ясен.
\\ в другую программу
О, хорошо
Но мой первый ответ тоже к этому привык. Так как есть и другая возможность, например:
с:> программа1 | программа2
он создает «канал» между консольными программами
программа2 получает на него стандартный ввод того, что программа1 выдает на стандартный вывод
Это обычная устаревшая практика Unix в консольных программах.
И таким образом НЕТ необходимости переписывать программы специально поддерживать его.
Если вас интересует только стандартный вывод программы, popen() сделает это довольно просто:
FILE* program_output = popen("command line to start the other program");
//read from program_output as you would read a "normal" file
//...
pclose(program_output);
Скорее всего, для этого вам потребуется использовать конвейеры, и, поскольку вы используете Windows, вот ссылка на Статья MSDN с примером, который, кажется, делает именно то, что вы хотели.