Program Resource

開発者向け各種コード、アルゴリズム、リソース情報ライブラリ もしくはねふぁの覚え書き

プログラムから外のアプリケーションを呼び出し、そのプロセスの終了を待ちたい場合には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: 英語

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*