如何在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_ALL_ACCESS
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ
无法打开进程 .
如果它被编译为32位应用程序,它将无法获得64位进程的名称(“无法获取模块文件名 . ”)
你试过 QueryFullProcessImageName 吗?
QueryFullProcessImageName
有时 GetModuleFileNameEx 返回299错误代码(我不知道为什么)
GetModuleFileNameEx
适用于所有Windows版本的唯一方法,包括XP,在Nathan Moinvaziri的回答中:
检查提供的网址:
Windows API to Get a Full Process Path
GetModuleFileNameEx并没有太多运气,QueryFullProcessImageName仅适用于Vista或更高版本 . 然而,我能够通过使用GetProcessImageFilename获取进程的路径 . 它返回Windows内核路径,但您可以使用QueryDosDevice将 GetProcessImageFilename 返回的设备路径与其正确的驱动器路径进行比较 .
GetProcessImageFilename
此页面显示如何规范化 GetProcessImageFilename 返回的Windows内核路径(请参阅 NormalizeNTPath 函数):
NormalizeNTPath
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/c48bcfb3-5326-479b-8c95-81dc742292ab/
5 回答
调用OpenProcess以获取与PID关联的进程的句柄 . 获得进程的句柄后,请调用GetModuleFileNameEx以获取其完全限定的路径 . 完成使用进程句柄后,不要忘记调用CloseHandle .
这是一个执行所需调用的示例程序(用您的PID替换1234):
Emerick Rogul解决方案的一些注意事项:
不要忘记将'psapi.lib'添加到链接器(其他依赖项) .
我也改变了
PROCESS_ALL_ACCESS
到PROCESS_QUERY_INFORMATION | PROCESS_VM_READ
因为我得到了:如果它被编译为32位应用程序,它将无法获得64位进程的名称(“无法获取模块文件名 . ”)
你试过
QueryFullProcessImageName
吗?有时
GetModuleFileNameEx
返回299错误代码(我不知道为什么)适用于所有Windows版本的唯一方法,包括XP,在Nathan Moinvaziri的回答中:
检查提供的网址:
Windows API to Get a Full Process Path
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/