【发布时间】:2019-04-21 01:23:32
【问题描述】:
我不知道我的代码有什么问题。当句柄无效时,我已经设置了条件。它将关闭句柄。但这似乎行不通。此代码试图获取 processName。当我输入存在PID时。它返回进程名称。相反,当我输入不存在像 10000 这样的 PID 时。它返回句柄无效。和错误异常抛出。但是在我的代码中,我已经在无效时设置了条件。它将关闭句柄。
std::wstring GetProcessNameById(DWORD i_processId)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, i_processId);
if (hProcess != NULL)
{
wchar_t processFilePath[MAX_PATH];
if (GetModuleFileNameExW(hProcess, NULL, processFilePath, MAX_PATH))
{
CloseHandle(hProcess);
wchar_t *processFileName = PathFindFileNameW(processFilePath);
return processFileName;
}
else
{
CloseHandle(hProcess);
SystemErrorMessage();
}
}
else
{
CloseHandle(hProcess);
SystemErrorMessage();
}
}
int main()
{
std::wcout << GetProcessNameById(10000);
return 0;
}
【问题讨论】:
-
@RbMm 这就是我认为如果成功处理它将返回 processName。但是失败的时候。我不把返回到 wstring。也许是这样。
-
我一开始没有注意到您的函数返回
wstring- 因为return processFileName;的结果是隐式转换。但是您对CloseHandle的逻辑当然是错误的。你只需要一个电话CloseHandle,以防它不为零 -
@RbMm 我不知道你是什么意思。我删除了其他大括号。结果还是一样。并且我认为如果我在其他支架内移除。我怎么知道它是否返回无效句柄。
-
OpenProcess返回或 0 或有效句柄。并且此句柄在开始时没有保护关闭属性。CloseHandle当然工作正确。不关闭手柄不起作用。你的代码不起作用 -
@RbMm 所以 0 与 c++ 中的 NULL 不同?
标签: c++ windows visual-studio winapi