【问题标题】:Killing a windows process efficiently有效地杀死一个windows进程
【发布时间】:2012-07-05 07:32:38
【问题描述】:

我正在编写一个 C++ QT 桌面应用程序,旨在在 Windows 操作系统上运行。
此应用程序应枚举所有正在运行的进程,并将终止特定进程(按名称识别)。我知道有两种方法可以做到:

  1. 使用 Windows API。
  2. 使用tasklist命令获取进程,taskkill结束进程。

在代码风格、效率和性能方面哪个选项更好?还是有第三种选择?

【问题讨论】:

  • 效率和性能对于一次性操作来说毫无意义。
  • 我在 Java 中遇到过这段代码的性能问题。因为我在应用程序启动期间进行了三次此枚举...
  • 只是好奇,但为什么你一开始要枚举三遍?

标签: c++ windows qt process


【解决方案1】:

IMO,效率和性能不应该让您担心。你可能不会在一秒钟内杀死 1000 个进程,所以如果一个进程需要 10 毫秒而另一个需要 100 毫秒,我怀疑有人会关心。

因此,选择其中之一的论据主要是易于编程和维护。枚举进程的 API 并不是最简单的,但您可以在网上找到很多示例(例如 here)。使用 tasklist 需要获取输出并解析。

出于以下原因,我会选择 API:

  1. 如果操作失败,您可以获得更多信息。您将确切地知道问题出在哪里以及是什么问题。
  2. 我不确定tasklisttaskkill 是否保证在每台Windows 机器上。它们确实随操作系统一起提供,但有人可能会认为它们扩大了攻击面或其他什么,并删除了它们。
  3. 解析文本容易出错。例如,我不知道tasklist 的输出是否取决于操作系统区域设置。你呢?

【讨论】:

    【解决方案2】:

    实际上我使用 WMI,我读到你可以使用 WMI 杀死进程

    Terminate method of the Win32_Process Class

    (仅供参考:))

    我在其他应用程序中使用 winAPI

    【讨论】:

      【解决方案3】:

      当然,您使用的是 Windows Api。这比使用外部 exe 杀死进程要好得多。 您可以使用 OpenProcess 获取进程句柄,这需要您的进程 ID。打开后,您可以使用TerminateProcess 提供进程句柄。

      【讨论】:

      • 您能否解释一下“更好……”这句话背后的原因?我并不否认,只是提出了一种改进答案的方法。
      • 一个原因是,如果你可以用几行代码做到这一点,为什么还要依赖一些外部 lib/dll。
      猜你喜欢
      • 2018-08-05
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 2010-12-27
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多