【问题标题】:How to get Process name from process id in windows through C++ without enumerating process?如何在不枚举进程的情况下通过 C++ 从 Windows 中的进程 ID 获取进程名称?
【发布时间】:2015-10-31 07:45:05
【问题描述】:

我需要从 Windows 中的进程 ID 获取进程名称,以查找与记录的事件关联的进程名称。它只能从记录的事件中获取执行进程 ID。进程句柄是使用GetProcessImageFileName() 方法所需的输入。它无法从记录的事件中获取进程句柄。

duplicate question 中,它谈到了当前正在运行的进程。但我现在不需要运行进程,因为它谈论记录的事件。 &我怀疑 processID 与 processName 组合在 Windows 中是否唯一。所以也需要考虑..

我希望必须有一些结构来将进程 ID 映射到进程名称。有这样的结构吗?或任何其他从进程 ID 获取进程映像名称的方法?

【问题讨论】:

  • 进程名是什么意思?
  • 你试过OpenProcess吗?打开它时,您无需请求完全访问权限。
  • 你的意思是GetProcessImageFileName()
  • @DavidHeffernan ProcessImageFileName
  • @AlanStokes 在msdn.microsoft.com/en-us/library/windows/desktop/… 中给出“打开一个现有的本地进程对象”。我无法理解“现有本地流程”是什么意思。这意味着当前正在运行的进程? & 如果不是,它是否返回以前的新句柄?

标签: c++ windows winapi process operating-system


【解决方案1】:

我需要从 Windows 中的进程 ID 中获取进程名称,以查找与记录的事件关联的进程名称。

如果您从日志中获取进程 ID,则它仅在原始进程仍在运行时才有效。否则,该 ID 对该进程名称不再有效。如果在您阅读日志之前该过程已经退出,则所有赌注都关闭。

我不需要当前正在运行的进程,因为它谈论记录的事件。

如果没有记录原始进程名称,那么你就不走运了。

我怀疑 processID 与 processName 组合在 Windows 中是否唯一。

进程 ID 仅在用于正在运行的进程时是唯一的。一旦一个进程结束,它的进程 ID 就不再有效,并且可以被重新用于后续的新进程。

我希望必须有一些结构来将进程 ID 映射到进程名称。

是的,但仅适用于正在运行的进程。您可以将进程 ID 传递给OpenProcess()。如果成功,它将向正在运行的进程返回一个HANDLE。然后,您可以将HANDLE 传递给GetModuleFileName()GetProcessImageFileName()QueryFullProcessImageName(),具体取决于您可以从OpenProcess() 获得的操作系统版本和权限。

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2013-09-16
    相关资源
    最近更新 更多