MFC로 만든 프로그램 내에서 다른 프로그램을 실행시킬 수 있다.

보통 WinExec()를 많이 쓰는데 이는 실행 명령만 날려주고 스스로는 프로그램을 계속 진행해 나가지만 경우에 따라서 실행시킨 프로그램이 끝난 후에 진행해야 하는 경우도 있다.

그런 경우에 다음과 같은 부분을 쓰면 된다.

 

/****************

SHELLEXECUTEINFO sei;
  ::ZeroMemory( &sei, sizeof(SHELLEXECUTEINFO) );
  
  sei.cbSize = sizeof(SHELLEXECUTEINFO);
  sei.lpFile = "MsiExec.exe";
  sei.lpParameters = "";
  sei.nShow = SW_SHOW;
  sei.fMask = SEE_MASK_NOCLOSEPROCESS;
  sei.lpVerb = "open";
  
  DWORD result = ::ShellExecuteEx( &sei );
  if( sei.hProcess != NULL )
  {
   ::WaitForSingleObject( sei.hProcess, INFINITE ); //여기서 해당 프로세스가 종료될때까지 대기하게됨
  }

******************/

1.SHELLEXECUTEINFO : 프로그램 정보를 가질 구조체이다.

 

2.::ZeroMemory( &sei, sizeof(SHELLEXECUTEINFO) ) : buffer에 해당 변수를 zero(0)로 만든다.

VOID ZeroMemory(
  PVOID
Destination,     // address of block to fill with zeros
  DWORD Length          // size, in bytes, of block to fill with zeros
);

3.ShellExecuteEx(&sei)  : 구조체에 지정한 프로그램을 실행시킨다.
WINSHELLAPI BOOL WINAPI ShellExecuteEx(
    LPSHELLEXECUTEINFO
lpExecInfo
);

 

4.::WaitForSingleObject( sei.hProcess, INFINITE ) : 프로세스가 끝날 때까지 대기한다.

DWORD WaitForSingleObject(
  HANDLE
hHandle,        // handle to object to wait for
  DWORD dwMilliseconds   // time-out interval in milliseconds
);

Posted by pkss
,