使用ShellExecuteEx启动的进程如何终止?

4

1)我使用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的进程!这该怎么做?

谢谢


1
请使用 CreateProcess() 而不是 ShellExecute/Ex() 来运行可执行文件。不仅它是首选的 API,而且它还返回进程 ID 和进程句柄,因此您不必手动调用 GetProcessId() - Remy Lebeau
@RemyLebeau 但是ShellExecute是运行需要权限提升(“runas”操作)的进程的唯一方法。 - Monah Tuk
@MonahTuk 这并不完全正确。虽然 "runas" 是唯一的 官方 API 来运行提升进程,但是在 CodeProject 上有一个 非官方的 CreateProcessElevated() API(以及其他 API),它利用了 ShellExecute() 内部使用的相同提升 API。 - Remy Lebeau
@RemyLebeau 感谢您的解释! - Monah Tuk
1个回答

4
要终止进程,您需要使用TerminateProcess函数。然而,它需要一个进程句柄作为参数:
TerminateProcess(shellExInfo.hProcess, 1);

如果您由于某种原因仅存储了进程ID而未存储句柄,则应使用 OpenProcess 函数首先打开句柄:

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

请记住,如果您关闭ShellExecuteEx()返回的进程句柄,那么在调用OpenProcess()之前,如果进程关闭并且其ID被重新用于不同的进程,就会引入竞争条件。因此,在使用进程完成之前最好保持进程句柄处于打开状态。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接