[英]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回答:
检查提供的网址:
您是否尝试过QueryFullProcessImageName
?
我对GetModuleFileNameEx 不太满意 ,而QueryFullProcessImageName仅在Vista或更高版本上可用。 但是,我能够通过使用GetProcessImageFilename获取进程的路径。 它返回Windows内核路径,但是您可以使用QueryDosDevice将GetProcessImageFilename
返回的设备路径与其正确的驱动器路径进行比较。
本页显示如何规范化由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.