Можно ли по дескриптору процесса узнать запущен ли он или нет? WinAPI

У меня класс сохраняет в переменных-членах дескриптор HANDLE, соответствующий определенному другому процессу в системе. Вполне очевидно, что необходимо перед действиями с дескриптором проверить процесс на существование, иначе может быть так, что мы попытаемся выполнить какие-то действия с процессом, а пользователь к этому моменту уже закрыл его. Разумеется, мы можем заново обратиться к системе, сделать снимок процессов через CreateToolhelp32Snapshot(), потом перебрать весь список и найти по имени нужный процесс. Но этот способ явно не блещет производительностью и удобством.

Я не смог найти в документации по winapi какие-либо функции, позволяющие проверить по дескриптору процесса его актуальность. Существуют ли такие функции вообще? Неужели нужно делать новый снимок процессов и перебирать его?


Ответы (1 шт):

Автор решения: user7860670

Имея дескриптор процесса можно определить, работает ли он, или уже вышел (но продолжает существовать, так как есть открытый дескриптор), посредством функции GetExitCodeProcess

DWORD exit_code{};
if (FALSE != ::GetExitCodeProcess(handle, ::std::addressof(exit_code)))
{
    if (STILL_ACTIVE != exit_code)
    {
        ::std::cout << "process has exited with code " << exit_code << ::std::endl;
    }
    else
    {
        ::std::cout << "process is still running" << ::std::endl;
    }
}
else
{
    DWORD const last_error{::GetLastError()};
    ::std::cout << "error #" << last_error << ::std::endl;
}
→ Ссылка