您是否有孩子程序的來源?檢查它如何讀取其輸入(或在此處發佈源代碼)。
您的孩子程序是否使用cmd輸入重定向,例如如果你做echo yes | childprogram.exe
?
如果不是,那麼程序可能會使用低級console functions來執行其輸入(可能間接地,例如通過_getch()
)。在這種情況下,您可能需要使用WriteConsoleInput來模擬輸入。
或者,您的重定向代碼可能存在錯誤。張貼在這裏。
EDIT使用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
獲得控制檯輸入句柄。當父母是一個控制檯應用程序時,子控制檯應用程序將與父母共享控制檯。如果父級是GUI應用程序,因此沒有控制檯,請在調用GetStdHandle
之前使用AttachConsole函數附加到子進程控制檯,然後在完成調用時調用FreeConsole。
它不適用於echo yes | 。我也嘗試過。 – 2010-06-29 11:05:19
@gunjit mishra - 然後,應用程序使用控制檯I/O函數或將其STDIO重新分配給控制檯輸入流。在這兩種情況下,'WriteConsoleInput'都應該有所幫助。 – atzz 2010-06-29 15:07:31
當我在管道句柄上使用writeconsoleinput時,它給出錯誤「非法訪問代碼」。我如何創建一個具有通用讀寫權限的管道。 – 2010-06-30 07:30:43