Есть ли у вас источники детской программы? Проверьте, как он читает свои входные данные (или опубликуйте источник здесь).
Работает ли ваша детская программа с перенаправлением ввода cmd, например, если вы делаете echo yes | childprogram.exe
?
Если нет, есть вероятность, что программа использует низкоуровневые функции консоли для ввода (возможно, косвенно, например, через _getch()
). В этом случае вам может понадобиться использовать WriteConsoleInput для имитации ввода.
Или, возможно, ошибка в вашем коде перенаправления. Опубликуйте это здесь.
РЕДАКТИРОВАТЬ Пример использования WriteConsoleInput:
#include <windows.h>
#include <process.h>
#include <stdlib.h>
#include <stdio.h>
static const INPUT_RECORD SimulatedInput [] =
{
{KEY_EVENT, {TRUE, 1, 0, 0, {L'e'}, 0}},
{KEY_EVENT, {TRUE, 1, 0, 0, {L'c'}, 0}},
{KEY_EVENT, {TRUE, 1, 0, 0, {L'h'}, 0}},
{KEY_EVENT, {TRUE, 1, 0, 0, {L'o'}, 0}},
{KEY_EVENT, {TRUE, 1, 0, 0, {L' '}, 0}},
{KEY_EVENT, {TRUE, 1, 0, 0, {L'T'}, 0}},
{KEY_EVENT, {TRUE, 1, 0, 0, {L'E'}, 0}},
{KEY_EVENT, {TRUE, 1, 0, 0, {L'S'}, 0}},
{KEY_EVENT, {TRUE, 1, 0, 0, {L'T'}, 0}},
{KEY_EVENT, {TRUE, 1, VK_RETURN, 0, {L'\r'}, 0}},
};
int main( int, char*[] )
{
printf("\n(type 'exit' to exit the subshell)\n");
// start a command interpreter asynchronously
intptr_t process_handle = _spawnlp(_P_NOWAIT, "cmd", "/k", "prompt", "SUBSHELL: ", NULL);
// get own console handle
HANDLE con_input_handle = GetStdHandle(STD_INPUT_HANDLE);
// send input to the console
DWORD n_written;
WriteConsoleInputW(con_input_handle, SimulatedInput, _countof(SimulatedInput), &n_written);
// wait for child process to exit
_cwait(NULL, process_handle, 0);
return 0;
}
Пример выше должен быть скомпилирован как консольная программа, потому что он использует GetStdHandle
для получения дескриптора ввода консоли. Когда parent является консольным приложением, дочернее консольное приложение будет использовать консоль совместно с parent. Если parent является приложением с графическим интерфейсом и, следовательно, не имеет консоли, используйте функцию AttachConsole для подключения к дочерней консоли процесса перед вызовом GetStdHandle
, а затем вызовите FreeConsole , когда закончите с ним.