Можно ли по дескриптору процесса узнать запущен ли он или нет? WinAPI
У меня класс сохраняет в переменных-членах дескриптор HANDLE, соответствующий определенному другому процессу в системе. Вполне очевидно, что необходимо перед действиями с дескриптором проверить процесс на существование, иначе может быть так, что мы попытаемся выполнить какие-то действия с процессом, а пользователь к этому моменту уже закрыл его. Разумеется, мы можем заново обратиться к системе, сделать снимок процессов через CreateToolhelp32Snapshot(), потом перебрать весь список и найти по имени нужный процесс. Но этот способ явно не блещет производительностью и удобством.
Я не смог найти в документации по winapi какие-либо функции, позволяющие проверить по дескриптору процесса его актуальность. Существуют ли такие функции вообще? Неужели нужно делать новый снимок процессов и перебирать его?
Ответы (1 шт):
Имея дескриптор процесса можно определить, работает ли он, или уже вышел (но продолжает существовать, так как есть открытый дескриптор), посредством функции 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;
}