WindowsAPI詳解——獲得進程可執行文件路徑的幾種方法


想獲得進程可執行文件的路徑最常用的方法是通過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;
...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM