Microsoft Windows 7: рекомендации по улучшению стабильности приложений
Часть 3. Механизм Applicatio
Механизм Application Restart and Recovery
Применение механизма Application Restart and Recovery из управляемого кода
Предыдущая статья данного цикла была посвящена зависанию приложений и преодолению этой проблемы. В публикации было отмечено, что на уровне операционной системы существует механизм Application Restart and Recovery, позволяющий перезапустить зависшие приложения или приложения, блокирующие какие-либо ресурсы без перезапуска самой операционной системы. Данный механизм используется, например, программами установки приложений — Windows Installer, а также ядром операционной системы для принудительного перезапуска приложений.
Механизм Application Restart and Recovery
Все современные приложения, написанные для работы под управлением операционных систем Microsoft Windows Vista и Windows 7, а также претендующие на совместимость с будущими версиями клиентских операционных систем, должны включать базовую поддержку механизма Application Restart and Recovery. Для этого обработчик событий должен уметь обрабатывать следующие события, связанные с завершением работы приложения, и выполнять следующие действия:
- сообщение WM_QUERYENDSESSION с параметром LPARAM = ENDSESSION_CLOSEAPP(0x1) — приложение с пользовательским интерфейсом должно немедленно ответить на это сообщение отсылкой TRUE и начать подготовку к перезапуску — конкретные действия зависят от приложения, чаще всего это сохранение состояния, содержимого документов и т.п.;
- сообщение WM_ENDSESSION с параметром LPARAM = ENDSESSION_CLOSEAPP(0x1) — приложение должно ответить на это сообщение отсылкой 0 в течение 30 с после получения сообщения и завершить работу;
- нажатие комбинации клавиш Ctrl+C — консольные приложения, получающие сообщение о нажатии данной комбинации клавиш, должны немедленно завершить работу.
Полноценная поддержка механизма Application Restart and Recovery включает регистрацию приложения в специальной структуре, поддерживаемой на уровне ядра операционной системы. Для этого следует использовать функцию RegisterApplicationRestart(), которой в качестве параметров передается строка и набор флагов. Строка может содержать опции, которые укажут приложению на то, что оно перезапущено, и, например, требуется загрузить сохраненные данные. Флаг может иметь либо нулевое значение, либо одно из значений, приведенных в табл. 1.
На уровне ядра операционной системы также существует ряд дополнительных функций, которые можно применять для расширенной поддержки механизма Application Restart and Recovery (табл. 2).
Ключевой здесь является возможность регистрации косвенно вызываемой функции — ApplicationRecoveryCallback, которая может использоваться для сохранения данных и состояния приложения в тех случаях, когда приложение зависает или возникает необрабатываемая критическая ошибка. После вызова зарегистрированной косвенно вызываемой функции приложение должно периодически (интервал указывается при регистрации функции, по умолчанию — каждые 5 с) вызывать фукцию ApplicationRecoveryInProgress(), указывая на то, что идет процесс сохранения данных, а после завершения сохранения — функцию ApplicationRecoveryFinished().
Помимо этого существует ряд функций, с помощью которых приложение может в случае необходимости принудительно завершать и перезапускать другие приложения (при наличии соответствующих прав).
К ним относятся функции, перечисленные в табл. 3, — все они реализованы в библиотеке Rstrtmgr.dll, а их прототипы описаны в файле RestartManager.h.
Применение механизма Application Restart and Recovery из управляемого кода
С помощью Windows API Code Pack for Microsoft .NET Framework можно использовать ряд перечисленных ранее функций в приложениях, написанных на управляемом коде: C# или Visual Basic .NET. Пространство имен Microsoft.WindowsAPICodePack.ApplicationServices содержит ряд классов и структур, позволяющих обращаться к функциям Restart Manager из управляемого кода (см. рисунок).
Сервисы приложений для управляемого кода
Класс ApplicationRestartRecoveryManager обеспечивает доступ к функциям механизма Application Restart and Recovery, класс RecoveryData содержит функцию-делегат (RecoveryCallback) и набор свойств для приложения, класс RecoverySettings — набор методов и свойств для управления процессом восстановления после перезагрузки, а класс RestartSettings задает опции для автоматической перезагрузки.
***
В данной статье мы упомянули механизм Windows Error Reporting (WER), с помощью которого можно собирать данные об ошибках, происходящих в приложениях, и либо отсылать эту информацию на специальный сайт Microsoft (сайт http://winqal.microsoft.com), либо сохранять локально. Ему будет посвящена заключительная статья данного цикла.