杀进程开始的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
答
要终止,你必须使用TerminateProcess
功能的过程。然而,它接收的句柄过程作为一个参数:
TerminateProcess(shellExInfo.hProcess, 1);
如果由于某种原因,你只存储进程ID而不是手柄,那么你应该先使用OpenProcess
功能打开的句柄:
HANDLE h = OpenProcess(PROCESS_TERMINATE, false, process_id);
TerminateProcess(h, 1);
CloseHandle(h);
+0
请记住,如果关闭'ShellExecuteEx()'返回的进程句柄,则在调用'OpenProcess()'之前,如果进程关闭并且其ID被重用于其他进程,则会引入争用条件。因此,最好在流程完成之前保持流程句柄处于打开状态。 –
使用'CreateProcess()'而不是'ShellExecute/Ex()'来运行可执行文件。它不仅是首选的API,而且还返回进程ID和进程句柄,因此您不必手动调用'GetProcessId()'。 –
@RemyLebeau但ShellExecute是运行进程需要权限提升(“runas”操作)的唯一方式。 –
@MonahTuk并不完全正确。虽然“runas”是运行提升进程的唯一*官方API,但有一个*非官方* ['CreateProcessElevated()'](https://www.codeproject.com/Articles/19165/Vista-UAC-The -Definitive-Guide)API(以及其他),它使用与ShellExecute()在内部使用的相同高程API。 –