代码之家  ›  专栏  ›  技术社区  ›  jay.lee

枚举进程()与CreateToolhelp32Snapshot()

  •  24
  • jay.lee  · 技术社区  · 14 年前

    我想知道这两个Win32 API函数之间是否存在任何差异(主要是性能方面的差异) 枚举进程() 创建工具帮助32Snapshot() 用于枚举所有活动进程和加载的模块。或者一个比另一个好用,为什么。

    5 回复  |  直到 14 年前
        1
  •  15
  •   Luke    14 年前

    我认为它们在性能(和结果)方面几乎相同,因为它们都调用相同的底层NT API,尽管CreateToolhelp32Snapshot()在创建一个section对象并将所有信息复制到其中时可能会有一点开销,而EnumProcesses()/EnumProcessModules()直接使用用户提供的缓冲区。不过,在现实世界中,这种差异可能可以忽略不计。

    我稍微喜欢EnumProcesses(),因为它(IMO)是一个更简单的API,但是如果需要,CreateToolhelp32Snapshot()会返回更多信息。EnumProcesses()的唯一缺点是,您应该在循环中调用它,因为您可能没有分配足够大的缓冲区;CreateToolhelp32Snapshot()负责缓冲区管理。实际上,我只是在堆栈上分配一个足够容纳1024个进程id或模块句柄的缓冲区;到目前为止,我还没有遇到一个系统,在这个系统中,这些限制甚至在远程接近达到。当然,不久前我们对麦克斯路径也说过同样的话,现在我们遇到了这个问题。。。

        2
  •  15
  •   Alex    9 年前

    • 枚举进程:16毫秒,207个进程
    • createtoolhelp32快照:141毫秒(16毫秒),207个进程
    • WTSEnumerateProcesses:16毫秒,207个进程
    • WtsEnumerateProcessEx(任何会话):16毫秒,207个进程

    结果是10次单函数调用的循环。它们在每次运行时都是100%可重复的。

    对于CreateToolhelp32Snapshot,主要结果是CreateToolhelp32Snapshot本身的调用,第二个结果(括号中)是使用First/Next循环。

    我认为人们混淆了“枚举所有进程”(get PIDs)和“获取进程/exe的名称”。第一个(“枚举”)与x32/x64交叉位没有任何问题。但是后一个(“get name”)确实有问题——不是每个方法都能在x32/x64上工作。

        3
  •  5
  •   Dmitriy    14 年前

    我不太记得了,但与CreateToolhelp32Snapshot()不同,EnumProcesses()有两个或两个限制之一: 2。不枚举Vista和Win7上提升的进程。

        4
  •  4
  •   neo85    13 年前

    EnumProcesses不会枚举所有系统进程,至少在Win XP上不会枚举svchost.exe的所有实例。

        5
  •  1
  •   sharptooth    14 年前

    EnumProcesses() 会失败,但是 CreateToolhelp32Snapshot() 跑得很好。

    枚举进程() 它在我的机器上运行良好,但在测试员的机器上没有。我只是用 创建工具帮助32Snapshot() 我再也没听说过有什么问题了。