我使用 CreateProcess 創建了兩個名為 p_1(記事本)和 p_2(父行程的克隆)的子行程。
我想要的是在 p_2 中終止 p_1,而不是在父行程中。
首先,我使用以下代碼創建了流程:
case WM_LBUTTONDOWN:
{
STARTUPINFO si = { 0, };
WCHAR notepad[32] = L"C:\\Windows\\notepad.exe";
WCHAR wndproc[32] = L"WindowProject.exe";
if (true == CreateProcess(NULL, notepad, NULL, NULL, true, 0, NULL, NULL, &si, &p_1))
{
CreateProcess(NULL, wndproc, NULL, NULL, true, 0, NULL, NULL, &si, &p_2);
}
}
break;
單擊滑鼠左鍵時,父行程創建兩個行程
這是通過右鍵單擊終止 p_1 行程的代碼:
case WM_RBUTTONDOWN:
{
TerminateProcess(p_1.hProcess, 0);
}
break;
但是p_2行程不能終止p_1,只有父行程可以終止p_1。
我以為是因為p_2沒有p_1的句柄,所以我在CreateProcess之后添加了DuplicateHandle(我不知道這是使用DuplicateHandle的正確方法):
if (true == CreateProcess(NULL, notepad, NULL, NULL, true, 0, NULL, NULL, &si, &p_1))
{
CreateProcess(NULL, wndproc, NULL, NULL, true, 0, NULL, NULL, &si, &p_2);
//give handle of p_1 to p_2
DuplicateHandle(&p_1.hProcess, &p_1.hProcess, &p_2.hProcess, &p_2.hProcess, 0, NULL, DUPLICATE_SAME_ACCESS);
}
但結果是一樣的。所以我寫的不是 DuplicateHandle p_2.hProcess = OpenProcess(PROCESS_TERMINATE, true, p_1.dwProcessId);,但結果仍然相同。
我想知道 p_2 如何終止 p_1。或者哪個功能正確使用?
(我是編程初學者,這是我第一次使用stackoverflow。即使這是一個沒有經驗的問題,請原諒我。)
uj5u.com熱心網友回復:
使用DuplicateHandle(),父級可以啟動 P1 和 P2,然后將其 P1 句柄復制到 P2 的背景關系中,然后通過您選擇的 IPC 機制(例如管道、視窗訊息等)將復制句柄的值傳遞給 P2 。然后 P2 可以將值存盤到HANDLE變數中并使用該句柄終止 P1。
另一種選擇是先讓父級啟動 P1,然后使用SetHandleInformation()它使其 P1 句柄可繼承,然后在bInheritHandles引數設定為 true 的情況下啟動 P2(最好使用顯式指定的 P1 句柄,STARTUPINFOEX而不是隱式繼承)。然后父行程可以在啟動 P2 時將其 P1 的句柄的值作為命令列引數傳遞,然后 P2 可以將引數決議為HANDLE可用于終止 P1 的變數。
另一種選擇是父級可以先啟動P1,然后在啟動P2時將P1的PID作為命令列引數傳遞,然后P2可以將引數決議為DWORD變數和OpenProcess()PID,然后它可以使用打開的句柄終止P1。
但是,第 3 種方法確實有一個小風險,因為在 P2 啟動之后和 P2 打開 PID 之前,可以通過其他方式終止 P1 ,從而有可能將 PID 重新用于完全不相關的行程。第一種和第二種方法避免了這種風險。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/515593.html
標籤:C 温纳皮
