OpenProcess дескриптор недействителен. CloseHandle не работает - PullRequest
0 голосов
/ 18 ноября 2018

Я не знаю, что-то не так с моим кодом. Я уже поставил условие, когда ручка недействительна. это будет CloseHandle. но, похоже, не работает. этот код пытается получить processName. когда я введу PID. это возвращает имя процесса. напротив, когда я ввод не существует PID, как 10000 . дескриптор возврата неверен. и ошибка Exception throw. но в моем коде я уже поставил условие, когда неверно. это закроет ручку.

    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 голосов
/ 18 ноября 2018

Компактная версия вашего кода делает ошибку очевидной:

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 является недействительным).Когда закончите, переделайте всю обработку ошибок.Это не будет работать надежно.Вы не можете слепо вызывать GetLastError , каждый раз, когда вызов API не удался.Закончив с этим, изучите идиому RAII , чтобы вам не приходилось писать код ручной очистки, как вы должны делать с C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...