참고자료가 될지 모르겠습니다.
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=6804
민인학 님이 쓰신 글 :
: 현재 저는 도스프로그램이 아규먼트로 하나의 프로젝트파일을 받아서
: 스탠다드 아웃으로 나오는 문자열을 GUI에 뿌리고 있습니다.
: 도스프로그램에서는 프로젝트파일을 파싱하다가 에러가나면 -1을 리턴해줍니다.
: 이 -1을 받아 다음의 루틴으로 넘어가는 것을 막아야 하는데.. 어떻게 해야하죠?
: 고수님들의 답변을 기다리겠습니다..
: 참고로 아래는 도스프로그램을 실행중에
: 스탠다드 아웃풋으로 나오는 문자열을 캡켜하여 구이(리치에디트)에 뿌려주는 루틴입니다.
:
: int __fastcall TIproveCompile::RunDosCommand(AnsiString Command)
: {
: // 표준출력 리다이렉션 시작
: bool flag;
: HANDLE hwrite, hread;
: SECURITY_ATTRIBUTES sa;
: sa.nLength = sizeof(SECURITY_ATTRIBUTES);
: sa.lpSecurityDescriptor = NULL;
: sa.bInheritHandle = true;
:
: // 어노니머스 파이프 생성
: flag = CreatePipe(&hread, &hwrite, &sa, 0);
: if(!flag) {
: iProveShowErrorMessage("Fail to open pipe.");
: return -1;
: }
:
: // 콘솔어플리케이션 프로세스 실행을 위한 준비
: STARTUPINFO si;
: memset(&si, 0, sizeof(STARTUPINFO));
: si.cb = sizeof(STARTUPINFO);
: si.dwFlags = STARTF_USESTDHANDLES;
: si.hStdOutput = hwrite; // 표준출력(stdout) 리다이렉션
: si.hStdError = hwrite; // 표준에러(stderr) 리다이렉션
: PROCESS_INFORMATION pi;
:
: AnsiString XilinxPath;
:
: // 콘솔어플리케이션 프로세스 실행
:
: flag = CreateProcess(NULL, Command.c_str(), NULL, NULL, true, DETACHED_PROCESS, NULL, NULL, &si, &pi);
:
: if(!flag) {
: iProveShowErrorMessage("Fail to create process.");
: return -1;
: }
:
: CloseHandle(hwrite); // 이것을 하지 않으면 프로세스가 block된다
:
: char buffer[512];
: char temp[MAX_SIZE];
: DWORD BytesRead;
: AnsiString ResultString;
: int ret;
:
: while(ReadFile(hread, buffer, sizeof(buffer)-1, &BytesRead, NULL) && BytesRead) {
: buffer[BytesRead] = '\0';
: ResultString = ResultString + buffer;
: MessageRichEdit->Lines->Text = ResultString;
: SendMessage( MessageRichEdit->Handle, WM_VSCROLL, SB_BOTTOM, 0 );
: iProveShowCompileMessage(buffer);
: Application->ProcessMessages();
: }
: CloseHandle(hread);
:
: return 1;
: }
:
:
: 호출형식은..
: RunDosCommand("c:\temp\parser.exe test.prj");
:
: 고수님들의 답변 기다리겠습니다.