c++ - EnumProcesses() 与 CreateToolhelp32Snapshot()

标签 c++ c windows winapi

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

最佳答案

以下是几个函数的结果:

  • EnumProcesses:16 毫秒,207 个进程
  • CreateToolhelp32Snapshot:141 毫秒(16 毫秒),207 个进程
  • WTSEnumerateProcesses:16 毫秒,207 个进程
  • WTSEnumerateProcessesEx(WTS_CURRENT_SESSION):16 毫秒,98 个进程
  • WTSEnumerateProcessesEx(WTS_ANY_SESSION):16 毫秒,207 个进程

机器正在运行启用了 UAC 的 Windows 8,用户未被提升(例如,无权访问系统进程)。主进程是 32 位的,机器是 64 位的,所以周围有很多 64 位进程。有:系统的 session 0,当前控制台用户的 session 1,另一个快速切换用户的 session 2。总共 207 个进程(这些都是 32 位和 64 位,包括伪“系统”进程) - Process Explorer 也确认了 207 个。在这 207 个进程中:23 个进程用于 session 2,98 个进程 - 用于 session 1,其余 - 用于 session 0。

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

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

我认为人们会混淆“枚举所有进程”(获取 PID)和“获取进程/exe 的名称”。第一个(“枚举”)在 x32/x64 交叉位方面没有任何问题。但后一种(“获取名称”)确实存在问题 - 并非每种方法都适用于 x32/x64。

关于c++ - EnumProcesses() 与 CreateToolhelp32Snapshot(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4021307/

相关文章:

ios - 适用于 Mac 上 Windows 的 Cordova 插件添加/删除

c++ - 条件字典排列

c++ - 多边形操作 - 如何对找到的顶点进行排序

c++ - 无模式对话框和加速器

c - 位操作,ascii 与二进制

windows - 无法安装 cargo-tree : couldn't determine visual studio generator

c++ - 当程序使用 sudo 运行时,ofstream 无法创建文件

c - 字符串操作,以下函数的作用是什么?

c - 如何从汇编代码中调用 C 函数 printf 获取整数

python - 在 python 中打开 Access 数据库时出错