我想知道在枚举所有活动进程和加载模块的两个Win32 API函数EnumProcesses()和CreateToolhelp32Snapshot()之间是否存在差异--主要是性能上的差异。或者一种比另一种更适合使用,以及原因。
发布于 2010-10-26 11:43:22
我认为它们在性能(和结果)方面几乎是一样的,因为它们都调用了相同的底层NT,尽管CreateToolhelp32Snapshot()在创建节对象并将所有信息复制到它时可能会有轻微的开销,而EnumProcesses()/EnumProcessModules()则直接使用用户提供的缓冲区。不过,这种差异在现实世界的表现中可能是微不足道的。
我稍微喜欢EnumProcesses(),因为它是一个更简单的API,但是如果需要的话,CreateToolhelp32Snapshot()会返回更多信息。EnumProcesses()的唯一缺点是您应该在循环中调用它,因为您可能没有分配足够大的缓冲区;CreateToolhelp32Snapshot()负责您的缓冲区管理。实际上,我只是在堆栈上分配了一个缓冲区,该缓冲区的大小足以容纳1024个进程I或模块句柄;到目前为止,我还没有遇到这样一个系统,其中任何一个限制甚至都远未达到。当然,我们不久前对MAX_PATH也说过同样的话,现在我们遇到了一些问题.
发布于 2015-10-02 14:58:43
以下是几个功能的结果:
机器运行Windows 8时启用了UAC,用户没有被提升(例如,无法访问系统进程)。主要进程是32位,机器是64位,所以周围有大量64位进程.有:系统会话0,当前控制台用户会话1,另一个快速切换用户会话2。进程资源管理器也确认207个进程(包括32位和64位进程,包括伪“系统”进程)- 207。在这207个进程中,23个进程用于会话2,98个进程用于会话1,其余流程用于会话0。
结果为10次单函数调用周期。它们在每次运行时都是100%可重复的。
对于CreateToolhelp32Snapshot,主要结果是CreateToolhelp32Snapshot本身的调用,第二个结果(括号中)是循环的第一个/下一步。
我认为人们混淆了“枚举所有进程”(获取PID)和“获取进程/exe名称”。第一个(“枚举”)与x32/x64交叉位没有任何问题。但后一种方法("get名称“)确实存在问题--并非所有方法都能在x32/x64之间工作。
发布于 2011-07-29 18:27:01
我不太记得,但与CreateToolhelp32Snapshot()不同,EnumProcesses()有两个或两个限制之一: 1.如果从32位进程在x64操作系统上调用,则不枚举64位进程。2.不枚举Vista和Win7上的提升进程。
https://stackoverflow.com/questions/4021307
复制相似问题