通过CreateProcess启动进程,记录pi.dwProcessId; 然后通过OpenProcess判断此进程是否结束。感觉没有什么错误。跑了一下发现,在任务管理器中结束被启动的进程后,OpenProcess照样能获得进程句柄,但在任务管理器中此进程确实不存在了。考虑到进程句柄是一个内核对象。内核对象有引用计数,引用计数为0后才会销毁,OpenProcess会使其引用计数增1。所以就在每次OpenProcess后CloseHandle一下。想着这样应该没有问题了,继续测试发现问题依旧存在。再三思索。觉得CreateProcess得到的pi.hProcess是不是也要关闭一下,马上在CreateProcess后增加CloseHandle(pi.hProcess),继续测试发现问题依旧存在。google一通也没有找到办法,实在没有办法了,抱着试一下的心里在CreateProcess后又增加CloseHandle(pi.hThread)。测试一下,发现问题解决,惊喜万分。
得到一个结论:
CreateProcess启动进程后,最好CloseHandle(pi.hProcess);CloseHandle(pi.hThread);一下,否则进程结束后其内核对象没有真正销毁。
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi = {0};
if (!CreateProcess(NULL, strCmd.GetBuffer(strCmd.GetLength()),
NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
g_log.Print(_T("Cannt start process %s"), strCmd);
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
//--------------------------------
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
CloseHandle(h);