杀进程开始的ShellExecuteEx

问题描述:

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。 –

要终止,你必须使用TerminateProcess功能的过程。然而,它接收的句柄过程作为一个参数:

TerminateProcess(shellExInfo.hProcess, 1); 

如果由于某种原因,你只存储进程ID而不是手柄,那么你应该先使用OpenProcess功能打开的句柄:

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

请记住,如果关闭'ShellExecuteEx()'返回的进程句柄,则在调用'OpenProcess()'之前,如果进程关闭并且其ID被重用于其他进程,则会引入争用条件。因此,最好在流程完成之前保持流程句柄处于打开状态。 –