我需要从上下文菜单中启动一个单独的进程/应用程序;我使用函数launch_program
来执行此操作。一旦终止,我不关心关于已创建进程的退出代码,我只是希望能够启动它。我的问题是:如果变量startup_info
和proc_info
通过引用CreateProcess
传递,我可以使用CloseHandle
,如果我只是去从函数返回到我的主线程?
void launch_program()
{
STARTUPINFO startup_info;
PROCESS_INFORMATION proc_info;
LPCSTR location = "C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe";
ZeroMemory( &startup_info,sizeof(startup_info));
startup_info.cb = sizeof(startup_info);
ZeroMemory( &proc_info,sizeof(proc_info));
CreateProcess( location,
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&startup_info,
&proc_info);
}
我使用https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx作为参考。
PS我刚用Internet Explorer作为填充物 [编辑]完整性:
CloseHandle(proc_info.hProcess);
CloseHandle(proc_info.hThread);
答案 0 :(得分:8)
是的,您可以并且应该在不再需要时关闭这些手柄,包括如果您永远不需要它们,请立即关闭。
从您关联的页面Creating Processes:
创建线程和进程句柄时具有完全访问权限,但如果指定安全描述符,则可以限制访问。 当您不再需要这些句柄时,请使用CloseHandle函数关闭它们。
[编辑] 为了强调*should* close
部分,这可能在文档中没有足够强烈地说明,这里引用@ RaymondChen的博客:
Why do some process stay in Task Manager after they’ve been killed?
在所有车手都承认了这个过程的死亡之后,这个过程的“肉”终于消失了。剩下的就是“进程对象”,它直到进程的所有句柄和进程中的所有线程都被关闭为止。 ( 你确实记得在传递给CreateProcess函数的PROCESS_INFORMATION结构中返回的句柄是CloseHandle,不是吗? )