簡體   English   中英

從 Windows 中的進程獲取完整路徑

[英]Get full path from a process in Windows

這個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);

在您的代碼中可以看到兩個明顯的錯誤,都可以通過閱讀文檔來理解。

首先,在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))

這個 API 沒有任何問題,這里唯一的錯誤是你的代碼。

文檔明確指出GetModuleFileNameExW的返回值是復制到緩沖區的字符串的長度。

如果返回值為 0,則函數失敗。

所以你只需要這樣寫:

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

順便說一句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;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM