如何在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获取完整进程路径