CreateToolhelp32Snapshot

CreateToolhelp32Snapshot

我想知道用于枚举所有 Activity 进程和已加载模块的两个Win32 API函数EnumProcesses()和CreateToolhelp32Snapshot()之间是否存在任何差异(主要是性能方面的差异)。还是如果一个比另一个要好,为什么?

最佳答案

我认为它们在性能(和结果)方面几乎都相同,因为它们都调用相同的底层NT API,尽管CreateToolhelp32Snapshot()可能会略有开销,因为它创建了节对象并将所有信息复制到该对象,而EnumProcesses ()/EnumProcessModules()直接与用户提供的缓冲区一起使用。但是,在现实世界中的性能差异可能微不足道。

我稍微喜欢EnumProcesses(),因为它是(IMO)使用的更简单的API,但是如果需要,CreateToolhelp32Snapshot()将返回更多信息。 EnumProcesses()的唯一缺点是您应该在循环中调用它,因为您可能没有分配足够大的缓冲区。 CreateToolhelp32Snapshot()会为您管理缓冲区。在实践中,我只是在堆栈上分配了一个足以容纳1024个进程ID或模块句柄的缓冲区。到目前为止,我还没有遇到过一个几乎无法达到这些限制的系统。当然,不久前我们对MAX_PATH说了同样的话,现在我们遇到了问题。

08-16 03:44