Windows API 獲得進程可執行文件路徑的幾種方法


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或更高版本的系統中使用。


免責聲明!

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



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