第 号
|
Last Updated 2005/07/22
|
CreateProcess
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 違反が発生
する場合がある
2004/02/24
参照
PostThreadMessage
起動待ち
CreateProcess()でリダイレクト
日付と時刻のプロパティ起動