|
현재 저는 도스프로그램이 아규먼트로 하나의 프로젝트파일을 받아서
스탠다드 아웃으로 나오는 문자열을 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");
고수님들의 답변 기다리겠습니다.
|