출처 :

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

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,