Last Updated 2004/03/03
Programming Tips Visual C++ API  索 引 
プロセスの終了
2004/03/03

CreateProcess() で起動させたアプリを終了させる.

以下の様にプロセスハンドルとスレッドハンドルをクローズしてもアプリケーションを終了させるということにはならない.
   CloseHandle(procInfo.hThread);       // procInfo は CreateProcess に
   CloseHandle(procInfo.hProcess);      // 渡す引数


TerminateProcess() や TerminateThread() は緊急遮断に使用するものであり,終了するが正常な終了方法ではない.

WM_CLOSE を送信するのが一番いいが,その送信先のウィンドウハンドルの取得が問題である.FindWindow() での検索は同じクラス名の別のアプリを終了させたい場合に不都合がある.

CreateProcess() にて起動したアプリケーションであればプロセスIDが分かるのでそこから該当のウィンドウを検索する.
トップレベルウィンドウを検索して,そのプロセスIDが CreateProcess() で起動したアプリケーションのプロセスIDと合致すれば,それが終了させるウィンドウハンドルである.


BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
  DWORD dwThreadId, dwProcessId;

  dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId);
  if (dwProcessId == (DWORD)lParam) {
    PostMessage(hwnd, WM_CLOSE, 0, 0);
  }

  return TRUE;
}


  // pi は CreateProcess() したときの PROCESS_INFORMATION
  EnumWindows(EnumProc, (LPARAM)pi.dwProcessId);


参照
CreateProcess
アプリケーション終了方法
クラス内コールバック関数
プロセスIDでプロセス強制終了
前後のTips
プロセスの終了

DSS ProgrammingTipsCGI Ver2.02