Всем привет, есть небольшая консольная утилитка 1 которая запускает другую консольную утилитку 2, все работает кроме того что утилитка 2 пишет себе в консоль, а в консоль утилитки 1 эти сообщения не попадают, как заставить утилитку 2 писать сообщения в консоль утилитки 1.
Спасибо.
Re: Перенаправление сообщений из консоли приложения в свою
Здравствуйте, _agg, Вы писали:
_>Всем привет, есть небольшая консольная утилитка 1 которая запускает другую консольную утилитку 2, все работает кроме того что утилитка 2 пишет себе в консоль, а в консоль утилитки 1 эти сообщения не попадают, как заставить утилитку 2 писать сообщения в консоль утилитки 1. _>Спасибо.
В c/c++ можно тупо использовать popen и выводить полученный поток в свою консоль. А так, большинство консольных функций платформозависимы. В WinAPI в CreateProcess, например, можно указать свой HANDLE для stdin/stdout/stderr для запускаемого приложения.
Re: Перенаправление сообщений из консоли приложения в свою
Здравствуйте, _agg, Вы писали: _>Всем привет, есть небольшая консольная утилитка 1 которая запускает другую консольную утилитку 2, все работает кроме того что утилитка 2 пишет себе в консоль, а в консоль утилитки 1 эти сообщения не попадают, как заставить утилитку 2 писать сообщения в консоль утилитки 1. _>Спасибо.
Поиском не нашёл, но примерно так: создаются пайпы для ввода-вывода и передаются в CreateProcess
В дебажной версии он запускает cmd.exe и перенаправляет его потоки на себя, создаёт консольное окно и всё, что вбивается внизу, скидывается во входящую пайпу cmd.exe, т.е. как будто вбивают напрямую там. А то, что cmd.exe отвечает — скидывается в консоль сверху.
детали
ConsoleWnd — своё окно консоли
Dlg — обёртка под диалог
Main — там всё создаётся, запускается и привязывается, код оттуда я приводил выше
Re[4]: Перенаправление сообщений из консоли приложения в свою
С вашим проектом сделал простую вещь в Debugging -> Command arguments подписал gpupdate /force. Запустилось 2 консоли, одна аля CMD с командной строкой, вторая с gpupdate /force причем gpupdate в свою консоль тоже ничего не написал... В общем пока результат не получил к сожалению, вроде простая же вещь, из своей консоли запускаю консольный процесс что бы запущенный консольный процесс писал сообщения в мою консоль.
Re[5]: Перенаправление сообщений из консоли приложения в свою
Здравствуйте, _agg, Вы писали:
_>С вашим проектом сделал простую вещь в Debugging -> Command arguments подписал gpupdate /force. Запустилось 2 консоли, одна аля CMD с командной строкой, вторая с gpupdate /force причем gpupdate в свою консоль тоже ничего не написал... В общем пока результат не получил к сожалению, вроде простая же вещь, из своей консоли запускаю консольный процесс что бы запущенный консольный процесс писал сообщения в мою консоль.
я его делал для своих java-консолек, чтобы в "красивое" окно выводить. Т.е. при запуске в качестве параметра указывал java-приложение(как по аналогии в дебаге указан cmd.exe). Проект его стартовал и дальше с прогой на яве можно было общаться через моё окно.
Странно, что у тебя не работает Возможно gpupdate не пользуется стандартными потоками ввода-вывода?
Re[5]: Перенаправление сообщений из консоли приложения в свою
Здравствуйте, _agg, Вы писали:
_>С вашим проектом сделал простую вещь в Debugging -> Command arguments подписал gpupdate /force. Запустилось 2 консоли, одна аля CMD с командной строкой, вторая с gpupdate /force причем gpupdate в свою консоль тоже ничего не написал... В общем пока результат не получил к сожалению, вроде простая же вещь, из своей консоли запускаю консольный процесс что бы запущенный консольный процесс писал сообщения в мою консоль.
Ну вот на коленке и без WinAPI с захардкоженным вызовом gpupdate пример:
#include <thread>
#include <stdio.h>
int main()
{
std::thread lambda_thread([]() {
FILE* f = _popen("gpupdate /force", "rt");
char acBuffer[256];
while (!feof(f))
{
memset(acBuffer, 0, sizeof(acBuffer));
if (fread(acBuffer, 1, sizeof(acBuffer), f) > 0) printf(acBuffer);
else break;
}
fclose(f);
});
getchar();
lambda_thread.join();
}
Re[6]: Перенаправление сообщений из консоли приложения в свою
Здравствуйте, _agg, Вы писали:
_>Этот код работает, минус в том что если процесс нужно запускать от администратора с помощью CreateProcessAsUser тогда это не получиться
можно запустить строкой типа "runas /user:administrator /savecred gpupdate /force". Пароль спросит только один раз, потом запомнит.