簡體   English   中英

創建新進程后是否需要使用CloseHandle?

[英]Do I need to use CloseHandle after creating a new process?

我需要從上下文菜單中啟動一個單獨的進程/應用程序; 我正在使用函數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);

是的,您可以並且應該在不再需要它們時關閉這些手柄,包括如果您永遠不需要它們的話。

從您鏈接的頁面創建進程

盡管您指定了安全描述符,但可以限制訪問權限,但創建的線程和進程句柄具有完全訪問權限。 當您不再需要這些句柄時,請使用CloseHandle函數關閉它們


[編輯]為了強調*should* close部分,這可能在文檔中沒有足夠強烈地說明,這里引用@ RaymondChen的博客:

為什么有些進程在被殺后會留在任務管理器中?

在所有的車手都承認了這個過程的死亡之后,這個過程的“肉”終於消失了。 剩下的就是“進程對象”,它直到進程的所有句柄和進程中的所有線程都被關閉為止。 你確實記得CloseHandle你傳遞給CreateProcess函數的PROCESS_INFORMATION結構中返回的句柄,不是嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM