Получить полный путь от процесса в Windows - PullRequest
0 голосов
/ 15 ноября 2018

что-то не так с этим API.Я уже проверил функцию возврата.Нет ошибок.но ничего не выводить.

HANDLE hSnapProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
PROCESSENTRY32 process;
process.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapProcess, &process);
do
{
    if (process.th32ProcessID != 0)
    {
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, process.th32ProcessID);
        if (hProcess != NULL) 
        {
            wchar_t filePath[MAX_PATH];
            if (!GetModuleFileNameExW(hProcess, NULL, filePath, MAX_PATH))
            {
                std::wcout << filePath << std::endl;
            }
        }
        CloseHandle(hProcess);
    }

} while (Process32Next(hSnapProcess, &process));
CloseHandle(hSnapProcess);

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

В вашем коде видны две явные ошибки, обе можно понять, прочитав документацию.

Во-первых, в GetModuleFileNameEx:

Дескриптор должен иметь права доступа PROCESS_QUERY_INFORMATION и PROCESS_VM_READ.

Ваша ручка имеет только PROCESS_QUERY_INFORMATION.

Во-вторых, снова в GetModuleFileNameEx:

Если функция завершается успешно, возвращаемое значение указывает длину строки, скопированной в буфер.

В случае сбоя функции возвращаемое значение равно нулю.

Ваша логика задом наперед. Заменить:

if (!GetModuleFileNameExW(hProcess, NULL, filePath, MAX_PATH))

с

if (GetModuleFileNameExW(hProcess, NULL, filePath, MAX_PATH))
0 голосов
/ 15 ноября 2018

В этом API нет ничего плохого, единственное, что здесь не так, это ваш код.

В документации четко указано, что возвращаемое значение GetModuleFileNameExW - это длина строкикопируется в буфер.

Если возвращаемое значение равно 0, функция не выполнена.

Так что вам просто нужно написать это:

...
if (GetModuleFileNameExW(hProcess, NULL, filePath, MAX_PATH) != 0)
{
   // handle "success" case
}
...

BTW CloseHandle(hProcess);должен находиться внутри блока if (hProcess != NULL).

Полный рабочий пример с проверкой ошибок

#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <psapi.h>

int main()
{
  HANDLE hSnapProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

  if (hSnapProcess != INVALID_HANDLE_VALUE)
  {
    PROCESSENTRY32 process;
    process.dwSize = sizeof(PROCESSENTRY32);
    Process32First(hSnapProcess, &process);
    do
    {
      if (process.th32ProcessID != 0)
      {
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, process.th32ProcessID);
        if (hProcess != NULL)
        {
          wchar_t filePath[MAX_PATH];
          if (GetModuleFileNameExW(hProcess, NULL, filePath, MAX_PATH))
          {
            std::wcout << filePath << std::endl;
          }
          else
          {
            std::wcout << L"GetModuleFileNameExW failed with error" << GetLastError() << std::endl;
          }

          CloseHandle(hProcess);
        }
      }

    } while (Process32Next(hSnapProcess, &process));

    CloseHandle(hSnapProcess);
  }
  else
  {
    std::wcout << L"CreateToolhelp32Snapshot failed with error" << GetLastError() << std::endl;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...