C ++ Windows - 如何从PID获取进程路径

时间:2009-12-19 15:01:43

标签: c++ windows

如何在Windows上使用C ++从PID中检索进程的完全限定路径?

5 个答案:

答案 0 :(得分:25)

调用OpenProcess以获取与PID关联的进程的句柄。掌握完流程后,请致电GetModuleFileNameEx以获取其完全合格的路径。完成使用流程句柄后,不要忘记调用CloseHandle

这是一个执行所需调用的示例程序(用您的PID替换1234):

#include <windows.h>
#include <psapi.h> // For access to GetModuleFileNameEx
#include <tchar.h>

#include <iostream>

using namespace std;

#ifdef _UNICODE
  #define tcout wcout
  #define tcerr wcerr
#else
  #define tcout cout
  #define tcerr cerr
#endif

int _tmain(int argc, TCHAR * argv[])
{
  HANDLE processHandle = NULL;
  TCHAR filename[MAX_PATH];

  processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, 1234);
  if (processHandle != NULL) {
    if (GetModuleFileNameEx(processHandle, NULL, filename, MAX_PATH) == 0) {
      tcerr << "Failed to get module filename." << endl;
    } else {
      tcout << "Module filename is: " << filename << endl;
    }
    CloseHandle(processHandle);
  } else {
    tcerr << "Failed to open process." << endl;
  }

  return 0;
}

答案 1 :(得分:3)

Emerick Rogul解决方案的一些注释:

不要忘记将'psapi.lib'添加到链接器(其他依赖项)。

我还将PROCESS_ALL_ACCESS更改为PROCESS_QUERY_INFORMATION | PROCESS_VM_READ因为我得到了:

  

无法打开流程。

如果它被编译为32位应用程序,它将无法获得64位进程的名称(“无法获取模块文件名。”)

答案 2 :(得分:1)

您是否尝试过QueryFullProcessImageName

答案 3 :(得分:1)

有时GetModuleFileNameEx会返回299错误代码(我不知道原因)

适用于所有Windows版本的唯一方法,包括XP,在Nathan Moinvaziri的回答中:

检查提供的网址:

Windows API to Get a Full Process Path

答案 4 :(得分:0)

GetModuleFileNameEx我没有太多运气,QueryFullProcessImageName仅适用于Vista或更高版本。然而,我可以使用GetProcessImageFilename获取流程的路径。它返回Windows内核路径,但您可以使用QueryDosDeviceGetProcessImageFilename返回的设备路径与其正确的驱动路径进行比较。

此页面显示了如何规范化GetProcessImageFilename返回的Windows内核路径(请参阅NormalizeNTPath函数):

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/c48bcfb3-5326-479b-8c95-81dc742292ab/