繁体   English   中英

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

[英]C++ Windows - How to get process path from its PID

如何在Windows上使用C ++从进程的PID检索进程的标准路径?

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

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

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

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

无法打开进程。

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

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

适用于Windows所有版本(包括XP)的唯一方法是Nathan Moinvaziri回答:

检查提供的网址:

Windows API获取完整的处理路径

您是否尝试过QueryFullProcessImageName

我对GetModuleFileNameEx 不太满意 ,而QueryFullProcessImageName仅在Vista或更高版本上可用。 但是,我能够通过使用GetProcessImageFilename获取进程的路径。 它返回Windows内核路径,但是您可以使用QueryDosDeviceGetProcessImageFilename返回的设备路径与其正确的驱动器路径进行比较。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM