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);
}
문득 만들고 싶은 유틸이 있어서.. 기능 구현중 잘 해결이 안되서 문의드립니다.
요점은 도스화면을 캡쳐해서.. 화면에 뿌리는건데..
도스 명령의 수행 시간이 길경우.. 한동안 화면이 멈춰 있다가...
캡쳐 내용이 보여집니다. 소스를 보시면 그럴 수 밖에 없음을 아실텐데
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);
}
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
» | 사용자 도구.. 구현 방법에 대한 문의 입니다. | 안운기 | 2007.10.04 | 25596 |
273 | [re] 이런기능 어떨까요? [1] | 관리자 | 2007.07.18 | 23162 |
272 | 이런기능 어떨까요? | 이성용 | 2007.07.14 | 22582 |
271 | [re] 폰트 변경 관련 질문입니다. | 관리자 | 2007.07.03 | 23994 |
270 | [re] 도움말 질문입니다. | 관리자 | 2007.07.03 | 22772 |
269 | 폰트 변경 관련 질문입니다. | 나이스투 | 2007.06.18 | 27368 |
268 | 도움말 질문입니다. | 김성준 | 2007.05.29 | 22685 |
267 | [re] 문법 강조하는 로직을 알고 싶습니다. [1] | 관리자 | 2006.11.13 | 24763 |
266 | 문법 강조하는 로직을 알고 싶습니다. | 양경철 | 2006.11.06 | 26693 |
265 | 화면 분할하는 방법이 있는지요~ [1] | 경훈 | 2006.10.13 | 25379 |