Если у меня есть консольная программа Windows, написанная с помощью C++, можно ли получить стандартный вывод этой программы во время работы программы? А если нет, то какой лучший способ переписать программу? Я знаю, что могу выводить файлы и постоянно проверять эти файлы на наличие обновлений. Есть ли другой способ? Есть ли способ лучше?Возможно ли получить выход программы во время ее работы?
ответ
Если это готовый консоль исполняемый вы всегда можете перенаправить его вывод в файл, например так:
с:> эхо какой-то текст> Файл
или
C:> программы> файл
Если вы имеете в виду это? Как ваш вопрос не совсем ясен.
\\ в другую программу
Oh, Ok
Но мой первый ответ также используется для этого. Как есть и другие возможности:
c:> program1 | program2
его сделать «трубу» между консольными программами
program2 получить на него, что стандартный ввод program1 бросает на стандартный вывод
Его общий престарелый Unix-полосная практику в консольных программах.
И, таким образом, НЕ нужно переписывать программы, чтобы их поддерживать.
Есть некоторые интересные статьи в проекте Код:
- CommandLineHelper (C#)
- Redirecting an arbitrary Console's Input/Output (MFC/C++)
- Universal Console Redirector (MFC/C++)
Да, если вы запускаете программу самостоятельно:
в CreateProcess, вы передаете STARTUPINFO, где вы можете указать дескрипторы для SDIN, STDOUT и STDERR. Обратите внимание, что oyu необходимо поставить все три, как только вы укажете флаг STARTF_USESTDHANDLES
.
Кроме того, ручки должны быть наследуемым (в противном случае, дочерний процесс не может получить доступ к ним), поэтому SECURITY_ATTRIBUTES в основном должны выглядеть, по крайней мере, как это:
SECURITY_ATTRIBUTES secattr = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
Вы могли бы открыть ручки на диск файлы, содержащие входные и выходные данные. В качестве альтернативы это может быть Pipes, который можно прочитать/записать постепенно, пока консольное приложение запущено.
Если вы заинтересованы только в стандартном выводе программы, 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 article с примером, который, кажется, делает именно то, что вы хотели.
Извлеките его туда, где? В другую программу или файл журнала? – zebrabox
в другую программу – blindley
И что другая программа также написана на C++? – zebrabox