|
도스 커멘드상에서 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;
}
|