首页 文章

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

提问于
浏览
12

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

5 回答

  • 3

    调用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

    Emerick Rogul解决方案的一些注意事项:

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

    我也改变了 PROCESS_ALL_ACCESSPROCESS_QUERY_INFORMATION | PROCESS_VM_READ 因为我得到了:

    无法打开进程 .

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

  • 25

    你试过 QueryFullProcessImageName 吗?

  • 0

    有时 GetModuleFileNameEx 返回299错误代码(我不知道为什么)

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

    检查提供的网址:

    Windows API to Get a Full Process Path

  • 1

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

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

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

相关问题