创建新进程后是否需要使用CloseHandle?

时间:2016-07-07 02:34:41

标签: windows winapi visual-c++

我需要从上下文菜单中启动一个单独的进程/应用程序;我使用函数launch_program来执行此操作。一旦终止,我不关心关于已创建进程的退出代码,我只是希望能够启动它。我的问题是:如果变量startup_infoproc_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);

1 个答案:

答案 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,不是吗?