|
||||
|
||||
Как определить зависло приложение или нет |
||||
Недокументированные особенности
Win9x/WinNT/Win2000
Некоторое время тому назад, я писал
очередное расширение для моего С одной стороны что может быть проще - использовать обычную функцию SendMessageTimeout для отправки окну приложения какого-то контрольного сообщения и если ф-ция выходит по таймауту, то считать, что приложение "висит". Однако хитрый и коварный системный программист, писавший Windows думал иначе (и конечно он был прав!) то, что окно (оконная ф-ция) не реагирует на внешние сообщения не может однозначно определять состояние "зависа", поэтому я решил запустить свой любимый дизассемблер и узнать очередную порцию правды о Windows. Как всегда, все оказалось очень просто
- библиотека User32.dll содержит
специальную ф-цию для определения
состояния приложения. Единственная
трудность только в том, что эта ф-ция
имеет разные названия и разный
синтаксис в HWND hWnd, // описатель главного окна приложения ); BOOL IsHungThread ( DWORD dwThreadId, // идентификатор потока, которому принадлежит главное окно приложения ); Так как эти ф-ции являются недокументированными, то Микрософт не включило их экспортные символы в User32.lib, но это не должно стать нам преградой - используем динамическую загрузку: typedef BOOL (WINAPI *PROCISHUNGAPPWINDOW) (HWND);typedef BOOL (WINAPI *PROCISHUNGTHREAD) (DWORD); PROCISHUNGAPPWINDOW IsHungAppWindow; PROCISHUNGTHREAD IsHungThread; HMODULE hUser32 = GetModuleHandle("user32");
Ну что же, теперь мы все можем и все умеем! Не документированные ф-ции Windows NT и Windows 95/98 и описания на английском языке: www.codepile.com Автор: Ашот Оганесян |
||||
|
||||
Copyright © 1999-2000гг. "Internet Zone" & Nik Romanov. nikspase@mail.ru, nikspase@hotmail.ru, http://www.izone.com.ua/ | ||||
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone" как на источник получения информации, при этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izone.com.ua/. |