|
다른 것은 더 분석해보아겠지만 아래 코드의 위치가 이상하군요.
siParam.hStdInput = hIread; // 표준입력(stdin)
이코드는 아래 코드 다음에 와야 합니다.
hIread = CreateFile("input.d", //표준입력용 input.d 파일 오픈
그리고, 파일로 리다이렉션할 때 CreatePipe가 필요한가요?
그냥 CreateFile로 구한 핸들을 지정하면 될 것으로 보입니다만.
한량 님이 쓰신 글 :
: 도스 커멘드상에서 analysis <input.d >output.out
:
: 이런식으로 하면 input을 받아 수행을 한다음 output을 만드는 파일이 있습니다.
:
: 다름이 아니오라 이것에 GUI를 씌우는 과정인데요
:
: output은 여기에 검색을 하여 표준출력부분을 이용하여 작성을 했습니다.(현재는 에러만 나오네요)
:
: 근데 표준입력( <input.in) 이부분을 작성하면 에러가 발생하면서 무한루프에 빠집니다.
:
: 이거 어떻하면 좋을까요?
:
: 아래는 소스입니다.
:
: bool __fastcall TForm1::RunDosCommand(AnsiString stCommand) // stCommand = "analysis.exe"
: //command 상에서 "analysis <input.d >output.out"로 명령한것과 같은 효과를 낼려고 합니다.
: {
: bool bflag;
: HANDLE hIwrite, hIread;
: HANDLE hOwrite, hOread;
: HANDLE hEwrite, hEread;
: SECURITY_ATTRIBUTES sa;
: STARTUPINFO siParam;
: PROCESS_INFORMATION piParam;
: DWORD dwExitCode;
:
: TStringList *output = new TStringList;
: char buffer[512];
: DWORD BytesRead;
:
: // Pipe Parameter Set
: sa.nLength = sizeof(SECURITY_ATTRIBUTES);
: sa.lpSecurityDescriptor = NULL;
: sa.bInheritHandle = true;
:
: // 어노니머스 파이프 생성 // Input File
: bflag = CreatePipe(&hIread, &hIwrite, &sa, 0);
: if (!bflag)
: {
: ShowMessage("Fail to open pipe.");
: return false;
: }
:
: // 어노니머스 파이프 생성 // output File
: bflag = CreatePipe(&hOread, &hOwrite, &sa, 0);
: if (!bflag)
: {
: ShowMessage("Fail to open pipe.");
: return false;
: }
:
: // 어노니머스 파이프 생성 // Error File
: bflag = CreatePipe(&hEread, &hEwrite, &sa, 0);
: if (!bflag)
: {
: ShowMessage("Fail to open pipe.");
: return false;
: }
:
: // 초기화
: FillMemory(&siParam, sizeof(STARTUPINFO), 0);
: FillMemory(&piParam, sizeof(PROCESS_INFORMATION), 0);
:
: // Param 섯팅
: siParam.cb = sizeof(STARTUPINFO);
: siParam.dwFlags = STARTF_USESTDHANDLES;
: siParam.wShowWindow = SW_HIDE;
: siParam.hStdInput = hIread; // 표준입력(stdin)
: siParam.hStdOutput = hOwrite; // 표준출력(stdout) 리다이렉션
: siParam.hStdError = hEwrite; // 표준에러(stderr) 리다이렉션
:
: hIread = CreateFile("input.d", //표준입력용 input.d 파일 오픈
: GENERIC_READ,
: FILE_SHARE_READ,
: &sa,
: OPEN_EXISTING,
: FILE_ATTRIBUTE_NORMAL,
: NULL);
:
: bflag = CreateProcess(NULL, stCommand.c_str(), NULL, NULL, true, DETACHED_PROCESS, NULL, NULL, &siParam, &piParam);
: WaitForInputIdle(GetCurrentProcess(), INFINITE);
:
: if(!bflag)
: {
: ShowMessage("Fail to create process. ");
: return false;
: }
:
: // 프로세스가 종료될때까지 대기함
: if(piParam.hProcess)
: {
: dwExitCode = STILL_ACTIVE;
:
: while(dwExitCode == STILL_ACTIVE)
: {
: WaitForSingleObject(piParam.hProcess, INFINITE);
: GetExitCodeProcess(piParam.hProcess, &dwExitCode);
: CloseHandle(piParam.hProcess);
: CloseHandle(piParam.hThread);
: UpdateWindow(Handle);
: }
: }
:
: CloseHandle(hIread);
: CloseHandle(hOwrite);
: CloseHandle(hEwrite);
:
: output->Clear();
:
: while(ReadFile(hOread, buffer, sizeof(buffer)-1, &BytesRead, NULL) && BytesRead)
: {
: buffer[BytesRead] = '\0';
: output->Add(buffer); //Output 결과저장
: }
: CloseHandle(hOread);
:
: output->SaveToFile("output.out");
:
: output->Clear();
: while(ReadFile(hEread, buffer, sizeof(buffer)-1, &BytesRead, NULL) && BytesRead)
: {
: buffer[BytesRead] = '\0';
: output->Add(buffer); //Error 결과저장
: }
: CloseHandle(hEread);
:
: output->SaveToFile("Error.out");
: delete output;
:
: return true;
:
: }
|