[英]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.