Last Updated 2004/02/24
Programming Tips Visual C++ API  索 引 
CreateProcess
2004/02/24

notepad を起動する必要最小限のコードは以下のとおり.

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    ZeroMemory(&pi, sizeof(pi));
    si.cb = sizeof(si);

    CreateProcess(NULL, "notepad", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

引数を渡すには,CreateProcess の第2引数で、コマンドラインパラメータを含む文字列を渡す.
    CreateProcess(NULL, "notepad foo.txt", ...);


起動したプロセスのハンドルとかは pi に格納される.

プロセスを起動するとすぐにリターンする.起動に失敗すると FALSE を返すので,原因はGetLastError() で調べる.

hProcess と hThread は必要ないなら,CreateProcess() した直後で

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

としておく必要がある.
(これをしないと子プロセスが終了してもオブジェクトを解放できない)

プロセスの終了を待ちたい場合など WaitForSingleObject を使用するのであれば hProcess などは使用しなくなった時点で解放することになる.

    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);


また,非表示で実行させるには,STARTUPINFO の dwFlags に STARTF_USESHOWWINDOW,wShowWindow に SW_HIDE を指定する.

    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;



もし,起動する子プロセスがユーザインタフェースのないバッチ的なプログラムの場合,該当の開始部分に
    MSG msgDummy;
    PeekMessage(&msgDummy, NULL, 0, 0, PM_NOREMOVE);
とする.
こうしなければ親プロセスを再実行した場合 Windows95 などで VMM 違反が発生する場合がある


参照
PostThreadMessage
起動待ち
CreateProcess()でリダイレクト
日付と時刻のプロパティ起動
前後のTips
CreateProcess

DSS ProgrammingTipsCGI Ver2.01