2009-12-19 738 views

回答

25

撥打電話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; 
} 
+1

大多數模塊的轉向出現故障的獲取文件路徑:( – jondinham 2011-08-29 04:20:33

+1

是否從32位environemet叫了一個64位進程的PID時,它的工作?我面臨的問題,並不得不使用** QueryFullProcessImageName **而不是** GetModuleFileNameEx ** – 2014-11-13 17:55:00

1

的一些注意事項,以Emerick Rogul的解決方案:

不要忘記加上 'psapi.lib'鏈接器(附加依賴)。

我也改變PROCESS_ALL_ACCESSPROCESS_QUERY_INFORMATION | PROCESS_VM_READ,因爲我得到了:

無法打開過程。

如果它被編譯爲一個32位的應用程序將無法獲得64個進程的名稱(「無法獲取模塊文件名。」)

1

你試過QueryFullProcessImageName

0

我沒有非常幸運GetModuleFileNameExQueryFullProcessImageName僅適用於Vista或更高版本。然而,我可以通過使用GetProcessImageFilename來獲得進程的路徑。它將返回Windows內核路徑,但您可以使用QueryDosDeviceGetProcessImageFilename返回的設備路徑與其正確的驅動器路徑進行比較。

這個頁面展示如何正常化由GetProcessImageFilename返回Windows內核路徑(見NormalizeNTPath功能):

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/c48bcfb3-5326-479b-8c95-81dc742292ab/

+2

請參閱http://stackoverflow.com/questions/696306/run-time-check-failure-0-loading-queryfullprocessimagename-from-kernel32 -dll#696365關於如何定義** QueryFullProcessImageName ** API調用,即使您的SDK不支持它。 – 2014-11-13 17:59:03

0

有時GetModuleFileNameEx返回299錯誤代碼(我不知道爲什麼)

適用於Windows的所有版本,包括XP的唯一方法是在Nathan Moinvaziri回答:

檢查提供的網址:

Windows API to Get a Full Process Path

+0

也許符合我的意見,從32位進程我擔心它可能無法獲得64位進程的路徑。我不得不使用** QueryFullProcessImageName **而不是** GetModuleFileNameEx ** – 2014-11-13 17:57:11