A7Mの日記: 覚え書き:子プロセスの安全な終了方法
利用価値があるので覚え書き。
ShellExecuteExで子プロセスを起動すると、プロセスハンドルが帰ってくるので、こいつをTerminateProcessに渡してやる。
void __fastcall TfrmMain::btnExecuteClick(TObject *Sender)
{
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS ;
sei.hwnd = GetForegroundWindow();
sei.lpVerb = NULL;
sei.lpFile = "hogehoge.exe";
sei.lpParameters = NULL;
sei.lpDirectory = NULL;
sei.nShow = SW_SHOWNORMAL;
if (ShellExecuteEx(&sei) == FALSE) {
//失敗した場合のエラー処理
return;
}
// プロセスハンドルを保存
m_ChildProcess = sei.hProcess;
// 以下略
}
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
::TerminateProcess(m_ChildProcess, 0);
}
TerminateProcessは強制終了の意味合いが強いので、
FindWindowで子プロセスのウィンドウハンドルを取得し、
SendMessageでWM_CLOSEを送りつけたほうが安全らしい。
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
HWND hWnd = ::FindWindow("HogeHoge", NULL);
::SendMessage(hWnd, WM_CLOSE, 0, 0);
}
SendMessageでちゃんと終わるから、とりあえずこれでいくべ。
追記:
待てよ、このネタ、結構blog向きぢゃないか?
いちいち自分のWebサイトを更新するのも面倒だし、どうしよう。
スラドの日記に晒した分も全然まとめていない。
ま、スラドの日記もblogの一種といえば一種だし。
って、ちゃんとプロセス制御をやって、あ~んなことや、こ~んなことが出来るようになったんだから、
とっとと仕事の続きをしろ!>俺
覚え書き:子プロセスの安全な終了方法 More ログイン