Я пытаюсь создать функцию, которая будет порождать экземпляр программы, а затем передать некоторые данные в его STDIN, а затем прочитать вывод процесса с использованием C++. Я посмотрел пример MSDN, расположенный here, который довольно запутан для меня, и когда я пытаюсь использовать этот пример, я получаю некоторые неприятные коды ошибок, и это не сработает.Запись в процесс STDIN через окна Windows
HANDLE hWriteOUT, hReadOUT, hWriteIN, hReadIN;
SECURITY_ATTRIBUTES saPipe = {0};
PROCESS_INFORMATION procInfo = {0};
STARTUPINFO procSi;
DWORD dwWritten, dwRead;
char buf[512];
saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
saPipe.bInheritHandle = TRUE;
saPipe.lpSecurityDescriptor= NULL;
CreatePipe(&hReadOUT, &hWriteOUT, &saPipe, 0);
SetHandleInformation(hReadOUT, HANDLE_FLAG_INHERIT, 0);
CreatePipe(&hReadIN, &hWriteIN, &saPipe, 0);
SetHandleInformation(hReadIN, HANDLE_FLAG_INHERIT, 0);
ZeroMemory(&procSi, sizeof(STARTUPINFO));
procSi.cb = sizeof(STARTUPINFO);
procSi.hStdError = hWriteOUT;
procSi.hStdOutput = hWriteOUT;
procSi.hStdInput = hReadIN;
procSi.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(NULL, "cmd", NULL, NULL, TRUE, 0, NULL, NULL, &procSi, &procInfo);
//Gives me an error code of 18 but returns a 1 when a 0 indicates failure.
WriteFile(hWriteIN, "notepad", sizeof("notepad"), &dwWritten, NULL);
cout << GetLastError(); //This gives me error code 18 (ERROR_NO_MORE_FILES)
ReadFile(hReadOUT, buf, 512, &dwRead, NULL);
cout << buf; //This prints "Microsoft Windows [version 6.1.7601]
CloseHandle(hWriteIN);
код не в трубу строки «блокнот» в cmd.exe, но успех в запуске командной оболочки. Если я смотрю в диспетчере задач, появляется несколько экземпляров командной строки, но не блокноты. Кроме того, функция ReadFile()
является единственной, которая, казалось, сработала, но она даже не читает из процесса с каналами (блокнот, который должен был быть порожден) вместо этого, это чтение из CMD. И что еще хуже, это усекает все, кроме первой строки, которую он читает! (CMD печатает «Microsoft Windows ... \ n Авторское право ... \ n C: \ Users \ Foo> ... \ n", но `ReadFile() только захватывает первую строку)
Я пропустил этот. Первый вызов должен быть в порядке, но второй должен быть для 'hWriteIN', а не' hReadIN', так как дескриптор 'hReadIN' должен быть унаследован подпроцессом. –