도스&콘솔 프로그램 관련(창안띄우기,StdOut, Wait
페이지 정보
본문
이 코드는 DOS 프로그램 또는 Win32 Console 모드 프로그램을 외부실행화일로 사용하고자 할때 문제가 되는 다음 세가지 항목을 해결하는 방법을 담고 있습니다.
1. 콘솔창(DOS창) 창 안띄우기.
2. 끝날때까지 기다리기(실행이 끝난것을 감지하기)
3. 출력되는 내용을 화일로 저장하기
(만일 이 부분을 사용하시기 원치 않으시면 STARTF_USESTDHANDLES 를 삭제해 주세요)
void CTttDlg::OnOK()
{
// TODO: Add extra validation here
PROCESS_INFORMATION pInfo;
STARTUPINFO sInfo;
DWORD exitCode;
HANDLE hOut = CreateFile("stdinout.txt",
GENERIC_WRITE, NULL, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
sInfo.cb = sizeof(STARTUPINFO);
sInfo.lpReserved = NULL;
sInfo.lpReserved2 = NULL;
sInfo.cbReserved2 = 0;
sInfo.lpDesktop = NULL;
sInfo.lpTitle = NULL;
sInfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
sInfo.dwX = 0;
sInfo.dwY = 0;
sInfo.dwFillAttribute = 0;
sInfo.wShowWindow = SW_HIDE;
sInfo.hStdOutput = hOut;
if (!CreateProcess(NULL, "command.com /c lha a tt",
NULL, NULL, TRUE, 0, NULL, "c:\\",
&sInfo, &pInfo)) {
printf("ERROR: Cannot launch child process\n");
exit(1);
}
// Give the process time to execute and finish
WaitForSingleObject(pInfo.hProcess, INFINITE);
if (GetExitCodeProcess(pInfo.hProcess, &exitCode)) {
switch(exitCode) {
case STILL_ACTIVE:
printf("Process is still active\n");
break;
default:
printf("Exit code = %d\n", exitCode);
break;
}
} else {
printf("GetExitCodeProcess() failed\n");
}
CloseHandle(hOut);
}
위의 CreateProcess()를 호출하는 부분에서 "Command.com /c"를 호출하는 부분이 있는데 이렇게 해주지 않으면, 호출하는 프로그램이 DOS 프로그램인 경우 자동으로 창이 닫히지 않는 문제가 발생하기 때문입니다.
1. 콘솔창(DOS창) 창 안띄우기.
2. 끝날때까지 기다리기(실행이 끝난것을 감지하기)
3. 출력되는 내용을 화일로 저장하기
(만일 이 부분을 사용하시기 원치 않으시면 STARTF_USESTDHANDLES 를 삭제해 주세요)
void CTttDlg::OnOK()
{
// TODO: Add extra validation here
PROCESS_INFORMATION pInfo;
STARTUPINFO sInfo;
DWORD exitCode;
HANDLE hOut = CreateFile("stdinout.txt",
GENERIC_WRITE, NULL, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
sInfo.cb = sizeof(STARTUPINFO);
sInfo.lpReserved = NULL;
sInfo.lpReserved2 = NULL;
sInfo.cbReserved2 = 0;
sInfo.lpDesktop = NULL;
sInfo.lpTitle = NULL;
sInfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
sInfo.dwX = 0;
sInfo.dwY = 0;
sInfo.dwFillAttribute = 0;
sInfo.wShowWindow = SW_HIDE;
sInfo.hStdOutput = hOut;
if (!CreateProcess(NULL, "command.com /c lha a tt",
NULL, NULL, TRUE, 0, NULL, "c:\\",
&sInfo, &pInfo)) {
printf("ERROR: Cannot launch child process\n");
exit(1);
}
// Give the process time to execute and finish
WaitForSingleObject(pInfo.hProcess, INFINITE);
if (GetExitCodeProcess(pInfo.hProcess, &exitCode)) {
switch(exitCode) {
case STILL_ACTIVE:
printf("Process is still active\n");
break;
default:
printf("Exit code = %d\n", exitCode);
break;
}
} else {
printf("GetExitCodeProcess() failed\n");
}
CloseHandle(hOut);
}
위의 CreateProcess()를 호출하는 부분에서 "Command.com /c"를 호출하는 부분이 있는데 이렇게 해주지 않으면, 호출하는 프로그램이 DOS 프로그램인 경우 자동으로 창이 닫히지 않는 문제가 발생하기 때문입니다.
댓글목록
등록된 댓글이 없습니다.