我不知道我的代码有什么问题。句柄无效时,我已经提出条件。它将关闭。但似乎不起作用。这段代码试图获取processName。当我输入存在PID时。它返回processName。当我输入的不存在 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;
}
答案 0 :(得分:2)
紧凑的代码版本使错误显而易见:
if (hProcess != NULL)
{
// Left out for brevity
}
else
{
// Here, hProcess is NULL
CloseHandle(hProcess);
SystemErrorMessage();
}
本质上,这是在调用CloseHandle(NULL);
,大概是将线程的最后一个错误代码设置为ERROR_INVALID_HANDLE
。 SystemErrorMessage()
可能会盲目调用GetLastError
(而不评估是否应该这样做),并且如果返回的值不是ERROR_SUCCESS
,则抛出异常。
要解决此问题,您需要修复逻辑错误(在CloseHandle
分支中删除对else
的调用,您可以在其中知道 hProcess
无效)。完成后,重新处理整个错误处理。它不能可靠地工作。每当API调用失败时,您都不能盲目调用GetLastError。完成此操作后,请研究RAII idiom,这样您就不必像使用C一样编写手动清理代码。