想獲得進程可執行文件的路徑最常用的方法是通過GetModuleFileNameEx函數獲得可執行文件的模塊路徑這個函數從Windows NT 4.0開始到現在的Vista系統都能使用,向後兼容性比較好。第二種方法是GetProcessImageFileName函數,這個函數在Windows XP及其以後的系統中都能使用,使用此函數返回的路徑不是通常的系統盤符,如"C:\...",而是驅動層的表示方式"\Device\HarddiskVolume1\...",所以使用起來不是很方便。第三種方法是使用Windows Vista新增的函數QueryFullProcessImageName,由於是Vista新增的,所以兼容性不好。
下面來看看這三個函數的原型:
DWORD GetModuleFileNameEx(HANDLE hProcess,HMODULE hModule,LPTSTR lpFilename,DWORD nSize)
hProcess是目標進程的句柄、hModule是目標模塊的句柄(當此參數爲NULL時函數返回的是進程可執行文件的路徑)、lpFilename是存放路徑的字符串緩衝區、nSize表示緩衝區的大小。函數調用失敗將返回0。注:進程的句柄須有PROCESS_QUERY_INFORMATION和PROCESS_VM_READ權限。
DWORD GetProcessImageFileName(HANDLE hProcess,LPTSTR lpImageFileName,DWORD nSize)
hProcess是目標進程的句柄、lpImageFileName是存放路徑的字符串緩衝區、nSize表示緩衝區的大小。函數失敗將返回0。注:進程句柄需要有PROCESS_QUERY_INFORMATION的權限。
BOOL QueryFullProcessImageName(HANDLE hProcess,DWORD dwFlags,LPTSTR lpExeName,PDWORD lpdwSize)
hProcess是目標進程的句柄、dwFlags一般設爲0(表示返回的路徑是Win32的路徑格式,如"C:\...",如將其設爲PROCESS_NAME_NATIVE將返回"\Device\HarddiskVolume1\..."這樣的格式路徑)、lpExeName是存放路徑的字符串緩衝區、lpdwSize表示緩衝區的大小。函數失敗將返回FALSE。注:調用此函數的句柄須有PROCESS_QUERY_INFORMATION或這是PROCESS_QUERY_LIMITED_INFORMATION的權限,並且只能在Vista或更高版本的系統中使用。
調用GetModuleFileNameEx和GetProcessImageFileName需要包含Psapi.h頭文件,並鏈接到Psapi.lib
這幾個函數的調用方法都很簡單,下面我給出GetModuleFileNameEx的使用例子:
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
...
HANDLE h_Process=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,ProcessID);
wchar_t path[MAX_PATH+1];
if(!GetModuleFileNameEx(h_Process,NULL,path,MAX_PATH+1))
return false;
...
來源:http://flyxxtt.blogbus.com/logs/43559892.html
GetModuleFileNameEx函數在64位系統下,獲取不到64爲進程的可執行文件路徑,而QueryFullProcessImageName函數不支持xp系統,爲了兼容性考慮,使用GetProcessImageFileName函數比較好,不過該函數返回的格式是DOS格式,需要進行轉換,對於該函數獲得具體可執行文件路徑的方法會在另外一篇博文中進行講解。