2

プロセスを追跡するプログラムで次のコードを見つけました。

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);

この関数にはありません。ハンドルの漏れを見つけましたか、またはハンドルを自動的に閉じる魔法はありますか?

4

0 に答える 0