2015-09-25 2 views
0

Я использую VS C++ 2010. Мне нужно получить состояние программы, но кажется, когда программа говорит, что она перестала работать, моя функция не работает. Мне нужно, чтобы перезапустить программу, если она перестает работать.Как получить состояние программы (для прекращенной работы)

Мой код:

BOOL IsProcessRunning(DWORD pid) 
{ 
    HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid); 
    DWORD ret = WaitForSingleObject(process, 0); 
    CloseHandle(process); 
    return ret == WAIT_TIMEOUT; 
} 

ответ

3

Этот код не может работать. Если внешний процесс остановлен, то OpenProcess не будет работать, потому что процесс завершился, и PID больше недействителен. И вы не проверяете значение, возвращаемое OpenProcess. Или PID был повторно использован, и тогда у вас будет обращение к неправильному процессу.

Чтобы безопасно использовать WaitForSingleObject, вам необходимо получить ручку процесса и повесить на нее. Вызовите OpenProcess один раз, а затем используйте этот дескриптор для всех последующих вызовов до WaitForSingleObject. Вызовите CloseHandle только тогда, когда вы закончите работу с этим процессом.

Однако ваше использование WaitForSingleObject просто не будет полезно для обнаружения того, что программа не отвечает. В этом случае вызов OpenProcess будет успешным, так как процесс все еще существует и работает. Вызов WaitForSingleObject возвращает WAIT_TIMEOUT, так как процесс все еще запущен. В конце концов, повисший процесс все еще работает.

Таким образом, вся внутренность вашего кода неверна. Висящее окно (или даже любое окно) может существовать только в запущенном процессе! Вам нужно будет выбросить код, который у вас есть, и вместо этого просто вызвать IsHungAppWindow. Вам понадобится дескриптор окна для главного окна приложений.

+0

Спасибо, я проверил IsHungAppWindow. Я новичок в C++, поэтому я должен спросить. Как я могу получить Hwnd из другого приложения? –

+0

http://stackoverflow.com/questions/1888863/how-to-get-main-window-handle-from-processid –

Смежные вопросы