パスワードを忘れた? アカウント作成
636983 journal

A7Mの日記: 覚え書き:子プロセスの安全な終了方法

日記 by 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の一種といえば一種だし。

って、ちゃんとプロセス制御をやって、あ~んなことや、こ~んなことが出来るようになったんだから、
とっとと仕事の続きをしろ!>俺

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

※ただしPHPを除く -- あるAdmin

読み込み中...