C ++ Windows – 如何从PID获取进程path

如何在Windows上使用C ++检索进程的完全限定path?

调用OpenProcess来获取与PID相关的进程的句柄。 一旦你有了一个处理过程,调用GetmoduleeFileNameEx来获得它的完全合格的路径。 当你完成使用进程CloseHandle时,不要忘记调用CloseHandle

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

 #include <windows.h> #include <psapi.h> // For access to GetmoduleeFileNameEx #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 (GetmoduleeFileNameEx(processHandle, NULL, filename, MAX_PATH) == 0) { tcerr << "Failed to get module filename." << endl; } else { tcout << "modulee filename is: " << filename << endl; } CloseHandle(processHandle); } else { tcerr << "Failed to open process." << endl; } return 0; } 

你有没有试过QueryFullProcessImageName

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

不要忘记添加'psapi.lib'链接器(附加依赖项)。

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

无法打开进程。

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

我对GetmoduleeFileNameEx没有太大的好运,而QueryFullProcessImageName仅在Vista或更高版本上可用。 然而,我能够通过使用GetProcessImageFilename获取进程的路径。 它返回Windows内核路径,但可以使用QueryDosDevice将GetProcessImageFilename返回的设备路径与正确的驱动器路径进行比较。

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

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

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

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

检查提供的网址:

Windows API获取完整进程路径