如何有效地杀死C(Win32)中的进程?

新手上路,请多包涵

我目前正在编写一个非常轻量级的程序,所以我必须使用 C++,因为它没有绑定到 .NET 框架,这大大增加了程序的大小。

我需要能够终止进程,为此我需要获得一个进程句柄。不幸的是,我还没有想出如何做到这一点。

PS我知道要杀死一个进程,你必须使用 TerminateProcess

原文由 Kristina Brooks 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 780
2 个回答

OpenProcess() 所需的 PID 通常不容易获得。如果你得到的只是一个进程名称,那么你需要迭代机器上正在运行的进程。使用 CreateToolhelp32Snapshot 执行此操作,然后使用 Process32First 并使用 Process32Next 循环。 PROCESSENTRY32.szExeFile 为您提供进程名称(不是路径!),th32ProcessID 为您提供 PID。

下一个考虑是该过程可能出现不止一次。并且有可能将相同的进程名称用于非常不同的程序。比如“设置”。如果您不想将它们全部杀死,则需要尝试从它们那里获取一些运行时信息。可能是窗口标题栏文本。 GetProcessImageFileName() 可以为您提供 .exe 的路径。它使用本机内核格式,您需要 QueryDosDevice 将磁盘驱动器设备名称映射到驱动器号。

下一个考虑因素是您在 OpenProcess() 中要求的权限。你不太可能得到 PROCESS_ALL_ACCESS ,你只需要 PROCESS_TERMINATE 。虽然这也是特权。确保您用于运行程序的帐户可以获得该权限。

原文由 Hans Passant 发布,翻译遵循 CC BY-SA 2.5 许可协议

仅限窗户

system("taskkill /f /im servicetokill.exe")

原文由 user3290207 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题