繁体   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