プログラムから外のアプリケーションを呼び出し、そのプロセスの終了を待ちたい場合にはCreateProcess関数を使いWaitForSingleObjectで待つ事が出来るが、たまに二段階起動で子プロセスを起動し呼び出しプロセスが終了してしまい、見た目アプリケーションは動作中なのにプロセスが終了し戻ってきてしまう事がある。
そんな時に使える、子プロセスまで含めて監視し、子プロセスを含めすべてのプロセスが終了するのを待機するサンプルコードは以下の通りである。
参考リンク:
http://nienie.com/~masapico/api_QueryInformationJobObject.html
BOOL RunandWait(char *runfname,DWORD *dwretval) { //Run and track process and child process, wait for all family process to terminate STARTUPINFO si; PROCESS_INFORMATION pi; DWORD i; HANDLE hProcess; BOOL bJobAllEnd; si.cb = sizeof(si); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = NULL; si.dwFlags = 0; si.cbReserved2 = 0; si.lpReserved2 = NULL; if (!CreateProcess(NULL,runfname,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) return FALSE; PJOBOBJECT_BASIC_PROCESS_ID_LIST pList; pList = (PJOBOBJECT_BASIC_PROCESS_ID_LIST)GlobalAlloc(GMEM_FIXED, 10000); HANDLE hJob; hJob = CreateJobObject(NULL, "Paging Job Object"); AssignProcessToJobObject(hJob, pi.hProcess); do { QueryInformationJobObject(hJob, JobObjectBasicProcessIdList, pList, 10000, NULL); bJobAllEnd = TRUE; for(i=0; i<pList->NumberOfProcessIdsInList; i++) { hProcess = OpenProcess(SYNCHRONIZE, FALSE, pList->ProcessIdList[i]); if(hProcess != NULL) { CloseHandle(hProcess); bJobAllEnd = FALSE; } } Sleep(500); } while(!bJobAllEnd); GlobalFree(pList); CloseHandle(hJob); if (dwretval) GetExitCodeProcess(pi.hProcess, dwretval); return TRUE; }
This post is also available in: 英語