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

pix*_*xel 7 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);

}
Run Code Online (Sandbox Code Playgroud)

我使用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);
Run Code Online (Sandbox Code Playgroud)

dxi*_*xiv 9

是的,当你不再需要它们时,你可以而且应该关闭这些手柄,包括如果你永远不需要它们的话.

从您链接的页面创建进程:

尽管您指定了安全描述符,但可以限制访问权限,但创建的线程和进程句柄具有完全访问权限.当您不再需要这些句柄时,请使用CloseHandle函数关闭它们.


[编辑]为了强调*should* close在文档中可能没有足够强烈说明的部分,这里引用@ RaymondChen的博客:

为什么有些进程在被杀后会留在任务管理器中?

在所有的车手都承认了这个过程的死亡之后,这个过程的"肉"终于消失了.剩下的就是"进程对象",它直到进程的所有句柄和进程中的所有线程都被关闭为止.(你确实记得CloseHandle你传递给CreateProcess函数的PROCESS_INFORMATION结构中返回的句柄,不是吗?)

  • @pixel dxiv 在这里所说的一切都是正确的,我只想指出,调用 `CloseHandle` 来关闭进程(或线程)句柄不会*导致进程(或线程)终止。这就是为什么调用 `CloseHandle` 并不重要的原因。 (2认同)