Windows 2000 --- GetModuleFileNameEx()
Windows XP x32 --- GetProcessImageFileName()
Windows XP x64 --- GetProcessImageFileName()
Windows Server2003 --- GetProcessImageFileName()
Windows Vista --- QueryFullProcessImageName()
Windows 7 --- QueryFullProcessImageName()
1、獲得進程可執行文件的路徑最常用的方法是通過GetModuleFileNameEx函數獲得可執行文件的模塊路徑這個函數從Windows NT 4.0開始到現在的Vista系統都能使用,向后兼容性比較好
需要包含Psapi.h頭文件,並鏈接到Psapi.lib
DWORD GetModuleFileNameEx(
HANDLE hProcess, //目標進程的句柄
HMODULE hModule, //目標模塊的句柄,此參數為NULL時函數返回的是進程可執行文件的路徑
LPTSTR lpFilename, //存放路徑的字符串緩沖區
DWORD nSize //緩沖區的大小
)
函數調用失敗將返回0;注:進程的句柄須有PROCESS_QUERY_INFORMATION和PROCESS_VM_READ權限。
#include <Psapi.h> #pragma comment (lib,"Psapi.lib") ... HANDLE h_Process=OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE,ProcessID); CString strPath; if(!GetModuleFileNameEx(h_Process,NULL,strPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH+1)) return false; ...
2、GetProcessImageFileName函數,這個函數在Windows XP及其以后的系統中都能使用,使用此函數返回的路徑不是通常的系統盤符,如"C:\...",而是驅動層的表示方式"\Device \HarddiskVolume1\...",所以使用起來不是很方便
需要包含Psapi.h頭文件,並鏈接到Psapi.lib
DWORD GetProcessImageFileName(
HANDLE hProcess, //目標進程的句柄
LPTSTR lpImageFileName, //存放路徑的字符串緩沖區
DWORD nSize //緩沖區的大小
)
函數失敗將返回0;注:進程句柄需要有PROCESS_QUERY_INFORMATION和PROCESS_VM_READ的權限。
3、Windows Vista新增的函數QueryFullProcessImageName,由於是Vista新增的,所以兼容性不好
BOOL QueryFullProcessImageName(
HANDLE hProcess, //目標進程的句柄
DWORD dwFlags, //一般設為0,表示返回的路徑是Win32的路徑格式,如"C:\...";如將其設為PROCESS_NAME_NATIVE將返回"\Device\HarddiskVolume1\..."這樣的格式路徑
LPTSTR lpExeName, //存放路徑的字符串緩沖區
PDWORD lpdwSize //緩沖區的大小
)
函數失敗將返回FALSE。注:調用此函數的句柄須有PROCESS_QUERY_INFORMATION或這是PROCESS_QUERY_LIMITED_INFORMATION的權限,並且只能在Vista或更高版本的系統中使用。
