C ++ Windows - Как получить путь к процессу из его PID - PullRequest
13 голосов
/ 19 декабря 2009

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

Ответы [ 5 ]

26 голосов
/ 19 декабря 2009

Позвоните 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;
}
3 голосов
/ 25 июня 2011

Некоторые примечания к решению Эмерика Рогула:

Не забудьте добавить 'psapi.lib' в компоновщик (дополнительные зависимости).

Я также изменил PROCESS_ALL_ACCESS на PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, потому что получил:

Не удалось открыть процесс.

Если оно скомпилировано как 32-битное приложение, оно не сможет получить имя 64-битного процесса («Не удалось получить имя файла модуля».)

1 голос
/ 19 октября 2013

Иногда GetModuleFileNameEx возвращает код ошибки 299 (не знаю почему)

Единственный метод, который работает для всех версий Windows, включая XP, - ответ Натана Моинвазири:

проверьте предоставленный URL:

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

1 голос
/ 26 октября 2011

Вы пробовали QueryFullProcessImageName?

0 голосов
/ 22 декабря 2012

Мне не очень повезло с 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...