我目前正在编写一个非常轻量级的程序,所以我必须使用 C++,因为它没有绑定到 .NET 框架,这大大增加了程序的大小。
我需要能够终止进程,为此我需要获得一个进程句柄。不幸的是,我还没有想出如何做到这一点。
PS我知道要杀死一个进程,你必须使用 TerminateProcess 。
原文由 Kristina Brooks 发布,翻译遵循 CC BY-SA 4.0 许可协议
我目前正在编写一个非常轻量级的程序,所以我必须使用 C++,因为它没有绑定到 .NET 框架,这大大增加了程序的大小。
我需要能够终止进程,为此我需要获得一个进程句柄。不幸的是,我还没有想出如何做到这一点。
PS我知道要杀死一个进程,你必须使用 TerminateProcess 。
原文由 Kristina Brooks 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
OpenProcess() 所需的 PID 通常不容易获得。如果你得到的只是一个进程名称,那么你需要迭代机器上正在运行的进程。使用 CreateToolhelp32Snapshot 执行此操作,然后使用 Process32First 并使用 Process32Next 循环。 PROCESSENTRY32.szExeFile 为您提供进程名称(不是路径!),th32ProcessID 为您提供 PID。
下一个考虑是该过程可能出现不止一次。并且有可能将相同的进程名称用于非常不同的程序。比如“设置”。如果您不想将它们全部杀死,则需要尝试从它们那里获取一些运行时信息。可能是窗口标题栏文本。 GetProcessImageFileName() 可以为您提供 .exe 的路径。它使用本机内核格式,您需要 QueryDosDevice 将磁盘驱动器设备名称映射到驱动器号。
下一个考虑因素是您在 OpenProcess() 中要求的权限。你不太可能得到
PROCESS_ALL_ACCESS
,你只需要PROCESS_TERMINATE
。虽然这也是特权。确保您用于运行程序的帐户可以获得该权限。