나는 인터넷에서 많은 것을 검색했지만, 대부분은 reindirect output에 대해 이야기하고 있습니다. 아무도 성공적인 reindirect 입력 예제를 제공하지 않습니다. 아래의 코드의 경우, "ipconfig"또는 "192.168.0.10"명령을 실행했을 때 올바른 결과를 얻었습니다. 이러한 명령을 실행 한 후 하위 프로세스가 끝나기 때문에 입력이 필요하지 않기 때문입니다. 하지만 "ipconfig"명령 대신 "ftp"명령을 실행하면 콘솔 인 자식 프로세스가 다음 입력 명령을 기다리고 있습니다. 그리고 당신이 볼 수있는 것처럼이 경우 콘솔에 11111을 입력으로 쓰려고했습니다. 그러나 콘솔은 입력 명령을받지 못하고 입력 명령을 영원히 기다리지 못했습니다. 나는 성공적으로 응답어떻게 createprocess reindirect input success를 만들 수 있습니까? successally 결과가 다시 나가는 결과를 얻습니다.
#include <windows.h>
#include <fstream>
using namespace std;
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpComLine,
int nCmdShow)
{
SECURITY_ATTRIBUTES secAttr;
HANDLE hRead,hWrite;
char command[256];
char testBuf[256] = {0};
strcpy(command, "ipconfig");
// strcpy(command, "ping 192.168.0.10")
// strcpy(command, "ftp");
secAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
secAttr.lpSecurityDescriptor = NULL;
secAttr.bInheritHandle = TRUE;
HANDLE hTxtFile = CreateFile("tmp.txt", GENERIC_ALL, 0, &secAttr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hTxtFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Error createfile", NULL, MB_OK);
return 0;
}
HANDLE hWriteFile = CreateFile("Write.txt", GENERIC_WRITE, 0, &secAttr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hWriteFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Error createWritefile", NULL, MB_OK);
return 0;
}
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInfo;
startupInfo.cb = sizeof(STARTUPINFO);
GetStartupInfo(&startupInfo);
startupInfo.hStdError = hTxtFile;
startupInfo.hStdOutput = hTxtFile;
startupInfo.hStdInput = hWriteFile;
startupInfo.wShowWindow = SW_SHOW;
startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
char output[10240] = {0};
DWORD bytesRead;
if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&startupInfo,&processInfo))
{
MessageBox(NULL, "Error createprocess", NULL, MB_OK);
CloseHandle(hWrite);
CloseHandle(hRead);
return FALSE;
}
DWORD processExitCode = 0;
strcpy(testBuf, "11111\r\n");
while (GetExitCodeProcess(processInfo.hProcess, &processExitCode))
{
WriteFile(hWriteFile, testBuf, 7, &bytesRead, NULL);
if (processExitCode != STILL_ACTIVE)
{
// MessageBox(NULL, "End process", NULL, MB_OK);
break;
}
Sleep(1000);
}
SetFilePointer(hTxtFile, NULL, NULL, FILE_BEGIN);
ReadFile(hTxtFile, output, 10240, &bytesRead, NULL);
CloseHandle(hTxtFile);
MessageBox(NULL, output, NULL, MB_OK);
return 0;
}
1) 때보기 빈 입력 ('NumberOfBytesRead의 == 0 '또는 * ZwReadFile * 반환 *의 STATUS_END_OF_FILE *)은 2)'hStdInput'는'FILE_GENERIC_READ' 액세스 3이 있어야하지 가까운 핸들) 대부분의 프로그램이 필요합니다 간단히 종료하십시오. 따라서 코드가 파일 시스템 파일로 처리되지 않습니다. 또는 프로세스를 만들기 전에'hStdInput' *에 데이터를 써야합니다. – RbMm
4) 일반 메모 - 동기식 공유 파일을 사용할 때 사용하십시오 - 잘못된 파일 공유 * CurrentByteOffset *. * WriteFile *을 호출 할 때 자식 프로세스가 위치를 변경할 수 있기 때문에 생각하는 위치에서 작성할 수 없습니다 (* OVERLAPPED *에서 직접 오프셋을 사용하여 피할 수 있음). 또한 당신의 write change * CurrentByteOffset * 공유 파일 객체에 영향을 미치고 자식 프로세스에 영향을 준다. 5)'processExitCode! = STILL_ACTIVE'를 100 % 신뢰할 수있는 방법으로 사용하지 마라. 자식 프로세스가'ExitProcess (STILL_ACTIVE)'를 호출하면 어떻게 될까? – RbMm
내 프로젝트에서 이미 문제를 발견 했으므로 기본적으로 STARTF_USESTDHANDLES 속성을 사용할 때 문제가 발생합니다. create process는 비 대화식 콘솔을 생성합니다. 즉, create process 호출에서 하나의 명령 행만 실행할 수 있습니다. 내가 마지막 콘솔 출력에 따라 사용자 입력을받는 대화식 리디렉션 콘솔을 만들기 위해 createprocess를 사용할 수있는 아이디어는 없습니까?고마워요. –