如何在Windows上使用C++從PID中檢索進程的完全限定路徑?C++ Windows如何從PID中獲取進程路徑
回答
撥打電話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;
}
的一些注意事項,以Emerick Rogul的解決方案:
不要忘記加上 'psapi.lib'鏈接器(附加依賴)。
我也改變PROCESS_ALL_ACCESS
到PROCESS_QUERY_INFORMATION | PROCESS_VM_READ
,因爲我得到了:
無法打開過程。
如果它被編譯爲一個32位的應用程序將無法獲得64個進程的名稱(「無法獲取模塊文件名。」)
你試過QueryFullProcessImageName
?
我沒有非常幸運GetModuleFileNameEx和QueryFullProcessImageName僅適用於Vista或更高版本。然而,我可以通過使用GetProcessImageFilename來獲得進程的路徑。它將返回Windows內核路徑,但您可以使用QueryDosDevice將GetProcessImageFilename
返回的設備路徑與其正確的驅動器路徑進行比較。
這個頁面展示如何正常化由GetProcessImageFilename
返回Windows內核路徑(見NormalizeNTPath
功能):
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/c48bcfb3-5326-479b-8c95-81dc742292ab/
請參閱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
有時GetModuleFileNameEx
返回299錯誤代碼(我不知道爲什麼)
適用於Windows的所有版本,包括XP的唯一方法是在Nathan Moinvaziri回答:
檢查提供的網址:
也許符合我的意見,從32位進程我擔心它可能無法獲得64位進程的路徑。我不得不使用** QueryFullProcessImageName **而不是** GetModuleFileNameEx ** – 2014-11-13 17:57:11
- 1. 從子進程獲取PID
- 2. 如何從PID使用C獲取進程名稱
- 3. linux - 獲取進程的pid
- 4. ms C++獲取當前進程的pid
- 5. C++ Linux:從其路徑處理PID
- 6. 如何從批處理文件中獲取進程的PID?
- 7. 獲取遠程機器的WINDOWS路徑
- 8. 如何從Windows中的Bash獲得Windows路徑(相當於cygpath)?
- 9. 如何從Windows中的函數exec()獲取PID?
- 10. 如何從父perl守護進程獲取pid?
- 11. Win32進程如何獲取父進程的PID?
- 12. 如何在C中獲取子PID?
- 13. 如何從文件URL獲取路徑?
- 14. 如何從路徑獲取文件名?
- 15. 如何從c中獲取Windows服務安裝文件夾的完整路徑#
- 16. 如何從HDFS路徑中獲取絕對路徑
- 17. 如何在Windows中使用C++獲取應用程序數據路徑?
- 18. 如何在Unix/Linux中獲取進程的路徑
- 19. 如何獲取C#中安裝程序類中的msi路徑
- 20. 如何從json獲取動態路徑?
- 21. 按執行路徑獲取進程
- 22. 獲取運行firefox進程的PID
- 23. 如何使用C#在Windows上獲取chrome.exe的路徑?
- 24. 如何從Ant中獲取當前PID?
- 25. 如何從本地路徑獲取網絡路徑?
- 26. 如何在C#/ Win32中獲取正在運行的進程的DOS路徑名?
- 27. 如何從相對路徑中獲取我的Perl程序的絕對路徑?
- 28. 從ShellExecute獲取PID
- 29. 如何從C#中的文件路徑獲取子字符串?
- 30. 如何從QT中的QFileSystemModel獲取文件路徑(C++)
大多數模塊的轉向出現故障的獲取文件路徑:( – jondinham 2011-08-29 04:20:33
是否從32位environemet叫了一個64位進程的PID時,它的工作?我面臨的問題,並不得不使用** QueryFullProcessImageName **而不是** GetModuleFileNameEx ** – 2014-11-13 17:55:00