메뉴 건너뛰기

AcroSoft

델파이 질문 및 답변

질문 사용자 도구.. 구현 방법에 대한 문의 입니다.

안운기 2007.10.04 20:51 조회 수 : 25596 추천:34

AcroEdit의 사용자 도구 기능을 잘 사용해오다..
문득 만들고 싶은 유틸이 있어서.. 기능 구현중 잘 해결이 안되서 문의드립니다.

요점은 도스화면을 캡쳐해서.. 화면에 뿌리는건데..
도스 명령의 수행 시간이 길경우.. 한동안 화면이 멈춰 있다가...
캡쳐 내용이 보여집니다. 소스를 보시면 그럴 수 밖에 없음을 아실텐데
AcroEdit에서는 어떻게 구현했는지 궁금합니다.
제가 Pipe를 잘 쓸줄 몰라서요...


void __fastcall TMainForm::ExeCommand(String command)
{
    bool                flag;
    SECURITY_ATTRIBUTES sa;
    HANDLE              hwrite, hread;

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = true;

    // 어노니머스 파이프 생성
    flag = CreatePipe(&hread, &hwrite, &sa, 0);
    if (!flag)
    {
        ShowMessage("Fail to open pipe.");
        return;
    }

    // 콘솔어플리케이션 프로세스 실행을 위한 준비
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    memset(&si, 0, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESTDHANDLES;
    si.hStdOutput = hwrite;  // 표준출력(stdout) 리다이렉션
    si.hStdError = hwrite;   // 표준에러(stderr) 리다이렉션

    // 콘솔어플리케이션 프로세스 실행
//    flag = CreateProcess(NULL, command.c_str(), NULL, NULL, true, DETACHED_PROCESS,
//           NULL, MakeDir->Text.c_str(), &si, &pi);

    flag = CreateProcess(NULL, command.c_str(), NULL, NULL, true, 0,
           NULL, MakeDir->Text.c_str(), &si, &pi);
    if(!flag)
    {
       ShowMessage("Fail to create process.");
       return;
    }
    CloseHandle(hwrite);//이것을 하지 않으면 프로세스가 block된다

    char buffer[512];
    DWORD BytesRead;
    AnsiString ResultString;
    while(ReadFile(hread, buffer, sizeof(buffer)-1, &BytesRead, NULL) && BytesRead)
    {
        buffer[BytesRead] = '';
        ResultString = ResultString + buffer;
    }
    CloseHandle(hread);

    Memo1->Lines->Add(ResultString);
}
위로