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