如何在Windows上使用C ++从PID中检索进程的完全限定路径?
答案 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的回答中:
检查提供的网址:
答案 4 :(得分:0)
GetModuleFileNameEx我没有太多运气,QueryFullProcessImageName仅适用于Vista或更高版本。然而,我可以使用GetProcessImageFilename获取流程的路径。它返回Windows内核路径,但您可以使用QueryDosDevice将GetProcessImageFilename
返回的设备路径与其正确的驱动路径进行比较。
此页面显示了如何规范化GetProcessImageFilename
返回的Windows内核路径(请参阅NormalizeNTPath
函数):
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/c48bcfb3-5326-479b-8c95-81dc742292ab/