2012-11-02 147 views
3

1)我開始一個過程用的ShellExecuteEx殺進程開始的ShellExecuteEx

2)檢索PID與

GetProcessId(shellExInfo.hProcess) 

示例代碼:

SHELLEXECUTEINFO shellExInfo; 

shellExInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
shellExInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
shellExInfo.hwnd = NULL; 
shellExInfo.lpVerb = "open"; 
shellExInfo.lpFile = processToStart.c_str(); 
shellExInfo.lpParameters = processParams.c_str(); 
shellExInfo.lpDirectory = NULL; 
shellExInfo.nShow = SW_SHOW; 
shellExInfo.hInstApp = NULL; 

ShellExecuteEx(&shellExInfo); // start process 

GetProcessId(shellExInfo.hProcess); // retrieve PID 

現在我要殺死開始使用給定的PID進程!這怎麼可能?

THX

+1

使用'CreateProcess()'而不是'ShellExecute/Ex()'來運行可執行文件。它不僅是首選的API,而且還返回進程ID和進程句柄,因此您不必手動調用'GetProcessId()'。 –

+0

@RemyLebeau但ShellExecute是運行進程需要權限提升(「runas」操作)的唯一方式。 –

+0

@MonahTuk並不完全正確。雖然「runas」是運行提升進程的唯一*官方API,但有一個*非官方* ['CreateProcessElevated()'](https://www.codeproject.com/Articles/19165/Vista-UAC-The -Definitive-Guide)API(以及其他),它使用與ShellExecute()在內部使用的相同高程API。 –

回答

2

要終止,你必須使用TerminateProcess功能的過程。然而,它接收的句柄過程作爲一個參數:

TerminateProcess(shellExInfo.hProcess, 1); 

如果由於某種原因,你只存儲進程ID而不是手柄,那麼你應該先使用OpenProcess功能打開的句柄:

HANDLE h = OpenProcess(PROCESS_TERMINATE, false, process_id); 
TerminateProcess(h, 1); 
CloseHandle(h); 
+0

請記住,如果關閉'ShellExecuteEx()'返回的進程句柄,則在調用'OpenProcess()'之前,如果進程關閉並且其ID被重用於其他進程,則會引入爭用條件。因此,最好在流程完成之前保持流程句柄處於打開狀態。 –