Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结合CreateProcess调用WaitForSingleObject未清除_C++_Windows_Createprocess_Waitforsingleobject - Fatal编程技术网

C++ 结合CreateProcess调用WaitForSingleObject未清除

C++ 结合CreateProcess调用WaitForSingleObject未清除,c++,windows,createprocess,waitforsingleobject,C++,Windows,Createprocess,Waitforsingleobject,我在跟踪流程的程序中遇到了以下代码: void StartProcess(const std::wstring& processName, const CString& argument) { ... STARTUPINFO stInfo; PROCESS_INFORMATION prInfo; ZeroMemory( &stInfo, sizeof(stInfo) ); stInfo.cb = s

我在跟踪流程的程序中遇到了以下代码:

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
的调用有什么附加值。我看了一下,似乎超时为0的
WaitForSingleObject
用于检查进程是否仍在运行,但它只是刚刚创建的,那么为什么要检查呢?为什么要检查仍在运行的进程的退出代码

有人能澄清一下吗

我还发现:

CloseHandle(prInfo.hThread);
CloseHandle(prInfo.hProcess);

此函数中缺少。我有没有发现把手漏水,或者有什么魔法可以自动关闭把手

你有任何理由认为这个代码是正确的吗?因为,出于你具体说明的原因,我真的不这么认为。具体来说,
WaitForSingleObject
的第二个参数应该是
INFINITE
,这样代码才开始有意义,但即使这样,它也没有意义(因为跟踪已终止进程的ID是毫无意义的)。是的,它实际上做了它应该做的事情(至少它启动进程)。由于“WaitForSingleObject”调用中存在0,因此该进程实际上并未终止。正如MSDN上所述,调用将立即返回。但是我想知道它是否有一些用处。。。在我重构它之前:)。什么都没有。最好的情况是,这段代码非常幸运,进程立即成功终止——因此等待会立即返回,代码会记录被终止进程的ID。哇哇!鉴于此代码,更有可能
m_StartedServices
始终为空,并且在其上运行的任何其他代码也是不可操作的。您有任何理由认为此代码是正确的吗?因为,出于你具体说明的原因,我真的不这么认为。具体来说,
WaitForSingleObject
的第二个参数应该是
INFINITE
,这样代码才开始有意义,但即使这样,它也没有意义(因为跟踪已终止进程的ID是毫无意义的)。是的,它实际上做了它应该做的事情(至少它启动进程)。由于“WaitForSingleObject”调用中存在0,因此该进程实际上并未终止。正如MSDN上所述,调用将立即返回。但是我想知道它是否有一些用处。。。在我重构它之前:)。什么都没有。最好的情况是,这段代码非常幸运,进程立即成功终止——因此等待会立即返回,代码会记录被终止进程的ID。哇哇!给定此代码,更有可能
m_StartedServices
始终为空,并且在其上运行的任何其他代码也是不可操作的。