OpenProcess句柄无效。 CloseHandle不起作用

时间:2018-11-18 14:16:10

标签: c++ windows visual-studio winapi

我不知道我的代码有什么问题。句柄无效时,我已经提出条件。它将关闭。但似乎不起作用。这段代码试图获取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;
}

1 个答案:

答案 0 :(得分:2)

紧凑的代码版本使错误显而易见:

if (hProcess != NULL)
{
    // Left out for brevity
}
else 
{
    // Here, hProcess is NULL
    CloseHandle(hProcess);
    SystemErrorMessage();
}

本质上,这是在调用CloseHandle(NULL);,大概是将线程的最后一个错误代码设置为ERROR_INVALID_HANDLESystemErrorMessage()可能会盲目调用GetLastError(而不评估是否应该这样做),并且如果返回的值不是ERROR_SUCCESS,则抛出异常。

要解决此问题,您需要修复逻辑错误(在CloseHandle分支中删除对else的调用,您可以在其中知道 hProcess无效)。完成后,重新处理整个错误处理。它不能可靠地工作。每当API调用失败时,您都不能盲目调用GetLastError。完成此操作后,请研究RAII idiom,这样您就不必像使用C一样编写手动清理代码。