С++ Windows - Как получить путь процесса от PID

Как я могу получить полный путь к процессу из его PID с помощью С++ в Windows?

Ответ 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:

Windows API для получения полного пути процесса