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
[40188] DOS 프로그램에서 표준입력부분에 대한 질문입니다.
한량 [sk1241] 1005 읽음    2005-05-15 10:32
도스 커멘드상에서 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 프로그램에서 표준입력부분에 대한 질문입니다. 1103 2005/05/15
40192         Re:Re:DOS 프로그램에서 표준입력부분에 대한 질문입니다. 한량 793 2005/05/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.