출처 :
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=278&ref=200
이 코드는 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 프로그램인 경우 자동으로 창이 닫히지
않는 문제가 발생하기 때문입니다.
< 참고 >
HOWTO: Access Child Process Exit Code from 32-Bit Parent Proc.
Article ID: Q131775
'Development > C/C++' 카테고리의 다른 글
랜덤함수 C Source (0) | 2011.08.13 |
---|---|
디버깅용 콘솔창을 띄우자.(자바 콘솔 맹키로...) (0) | 2011.08.13 |
다중 쓰레드와 C++ (0) | 2011.08.13 |
날짜 스트링을 CTime 으로 변환 (0) | 2011.08.13 |
구조체(Structure)와 패딩비트(Padding Bits) (0) | 2011.08.13 |