Как я могу получить полный путь к процессу из его PID с помощью С++ в Windows?
С++ Windows - Как получить путь процесса от PID
Ответ 1
Вызовите OpenProcess
, чтобы обработать процесс, связанный с вашим PID. После того, как у вас есть дескриптор процесса, вызовите GetModuleFileNameEx
, чтобы получить его полностью определенный путь. Не забудьте вызвать CloseHandle
, когда вы закончите использовать дескриптор процесса.
Здесь пример программы, выполняющей требуемые вызовы (замените 1234 на ваш PID):
#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;
}
Ответ 2
Некоторые примечания к решению Emerick Rogul:
Не забудьте добавить 'psapi.lib' в компоновщик (дополнительные зависимости).
Я также изменил PROCESS_ALL_ACCESS
на PROCESS_QUERY_INFORMATION | PROCESS_VM_READ
, потому что получил:
Не удалось открыть процесс.
Если он скомпилирован как 32-битное приложение, он не сможет получить имя 64-битных процессов ( "Не удалось получить имя файла модуля".)
Ответ 3
Вы пробовали QueryFullProcessImageName
?
Ответ 4
Мне не повезло с GetModuleFileNameEx и QueryFullProcessImageName доступен только на Vista или выше. Однако я смог получить путь для процесса, используя GetProcessImageFilename. Он возвращает путь к ядру Windows, но вы можете использовать QueryDosDevice для сравнения пути устройства, возвращаемого GetProcessImageFilename
, с его правильным путем.
На этой странице показано, как нормализовать путь ядра Windows, возвращенный GetProcessImageFilename
(см. функцию NormalizeNTPath
):
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/c48bcfb3-5326-479b-8c95-81dc742292ab/
Ответ 5
Иногда GetModuleFileNameEx
возвращает код ошибки 299 (я не знаю почему)
Единственный метод, который работает для всех версий Windows, включая XP, - это ответ Натана Моинвазири:
проверьте предоставленный URL: