C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[40190] Re:DOS 프로그램에서 표준입력부분에 대한 질문입니다.
[] 1102 읽음    2005-05-15 18:30
다른 것은 더 분석해보아겠지만  아래 코드의 위치가 이상하군요.
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;
:
: }

+ -

관련 글 리스트
40188 DOS 프로그램에서 표준입력부분에 대한 질문입니다. 한량 1005 2005/05/15
40190     Re:DOS 프로그램에서 표준입력부분에 대한 질문입니다. 1102 2005/05/15
40192         Re:Re:DOS 프로그램에서 표준입력부분에 대한 질문입니다. 한량 793 2005/05/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.