プロセスを追跡するプログラムで次のコードを見つけました。
void StartProcess(const std::wstring& processName, const CString& argument)
{
...
STARTUPINFO stInfo;
PROCESS_INFORMATION prInfo;
ZeroMemory( &stInfo, sizeof(stInfo) );
stInfo.cb = sizeof(stInfo);
stInfo.dwFlags=STARTF_USESHOWWINDOW;
stInfo.wShowWindow=SW_SHOWDEFAULT;
bRet = CreateProcess(NULL,
(LPTSTR)(LPCTSTR)sCmdline,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS,
NULL,
_T("."),
&stInfo,
&prInfo);
// Create process has gone OK and we have to wait.
if (bRet)
{
bRet = FALSE;
int nRetWait = WaitForSingleObject(prInfo.hProcess,0);
if (nRetWait == WAIT_OBJECT_0)
{
// Get the exit code of the process
DWORD dwExitCode = 0;
::GetExitCodeProcess(prInfo.hProcess, &dwExitCode);
if (0 == dwExitCode)
{
// The program succeeded
m_StartedServices.push_back(prInfo.dwProcessId;);
bRet = TRUE;
}
}
}
}
コードはプロセスを開始し、その後のスタジアムで ( を使用してm_StartedServices
) プロセスを終了する必要があります。WaitForSingleObject
ただし、呼び出しと呼び出しにどのような付加価値があるのか 疑問に思ってGetExitCodeProcess
います。少し調べてみたところWaitForSingleObject
、プロセスがまだ実行されているかどうかを確認するためにタイムアウトが 0 の が使用されているようですが、作成されたばかりなので、なぜ確認するのですか? また、まだ実行中のプロセスの終了コードを確認する必要はありません。
誰でもこれをクリアできますか?
また、次の呼び出しが見つかりました:
CloseHandle(prInfo.hThread);
CloseHandle(prInfo.hProcess);
この関数にはありません。ハンドルの漏れを見つけましたか、またはハンドルを自動的に閉じる魔法はありますか?