Программное завершение работы компьютера
Программное завершение работы компьютера Часто мы видим, как многие программы сами выключают или перезагружают компьютер, иногда необходимо реализовать эти же действия в самостоятельно созданных приложениях. Оказывается, в коллекции Windows API имеется ряд функций, позволяющих это выполнить. Речь идет о функциях ExitWindows(), ExitWindowsEx(), InitiateSystemShutdown() и AbortSystemShutdown(). Давайте рассмотрим их подробнее.
Функция ExitWindowsEx() завершает сеанс пользователя, перезагружает или выключает машину. Она посылает сообщение WM_QUERYENDSESSION всем приложениям, работающим на машине в данный момент, для того чтобы определить, могут они быть закрыты или нет. Объявление функции выглядит следующим образом: BOOL ExitWindowsEx (UINT uFlags, DWORD dwReserved). Первый параметр является операцией, которую мы хотим произвести. Он может принимать следующие значения: EWX_LOGOFF — завершить сеанс пользователя, EWX_POWEROFF — выключить питание машины (причем система должна поддерживать эту операцию программно), EWX_REBOOT — перезагрузить ОС, EWX_SHUTDOWN — привести систему в состояние, когда можно безопасно выключить питание машины (в Windows 9x этот параметр отключает питание, а в Windows 2000 он выводит сообщение о том, что мы можем "безболезненно" выключить компьютер сами). Кроме этого, первый параметр может включать такие значения, как EWX_FORCE и EWX_FORCEIFHUNG. Первое значение заставляет приложения завершаться "насильно". Когда установлен его флаг, система не посылает приложениям сообщения WM_QUERYENDSESSION и WM_ENDSESSION, что может стать причиной не сохранения данных некоторыми программами (изменения в документах и настройках не произойдут). Второе значение используется в Windows 2000. Оно заставляет приложения завершаться, когда те не реагируют на посланные сообщения, описанные выше. Если используется первое значение, то второе игнорируется.
Второй аргумент функции зарезервирован и может принимать любое значение, например NULL. Надо отметить, что если приложение должно работать в Windows NT или Windows 2000, то перед вызовом этой функции необходимо установить процессу привилегию SE_SHUTDOWN_NAME. Это очень важно, так как желаемого результата вы не получите, если процесс не обладает достаточными привилегиями. Функция ExitWindows() только завершает сеанс пользователя. У нее есть два параметра, которые зарезервированны и должны быть равны нулю.
Две последних функции можно использовать только в Windows NT или Windows 2000. Первая из них имеет объявление BOOL InitiateSystemShutdown(LPTSTR lpMachineName, LPTSTR lpMessage, DWORD dwTimeout, BOOL bForceAppsClosed, BOOL bRebootAfterShutdown). Первым параметром является указатель на строку, содержащую сетевое имя компьютера, для которого мы хотим выполнить эту функцию. Если же этот указатель NULL, то подразумевается локальный компьютер. Второй параметр — это указатель на строку, содержащую сообщение, которое увидит пользователь в диалоговом окне, появившемся после выполнения этой функции. Если сообщение не требуется, то этот параметр следует установить в NULL. Параметр dwTimeout задает промежуток времени (в секундах), в течение которого на экране будет находиться диалоговое окно, сообщающее о завершении работы компьютера. Также это промежуток, за который можно отменить завершение работы при помощи функции AbortSystemShutDown(). Если же параметр ноль, то диалоговое окно не выводится и отменить это действие нельзя. Четвертый параметр определяет потребность закрытия приложений с несохраненными данными. Если он TRUE, то подобные приложения закроются "насильно", в противном случае они попросят пользователя закрыть их вручную. Последний параметр этой функции определяет требование перегрузки компьютера сразу после завершения работы.
Последняя функция в нашем обзоре имеет объявление BOOL AbortSystemShutdown(LPTSTR lpMachineName). Она используется совместно с предыдущей функцией, когда требуется остановить процесс завершения работы. Ее параметр аналогичен одноименному параметру в функции InitiateSystemShutdown(). Использование данной функции имеет смысл только в том случае, если параметр dwTimeout в InitiateSystemShutdown() отличен от нуля. Надо отметить, что вызывающему процессу при использовании двух последних функций необходима установка привилегии SE_SHUTDOWN_NAME для локального компьютера и SE_REMOTE_SHUTDOWN_NAME — для удаленного. Наиболее распространенными причинами неудачной работы этих функций являются неправильное имя машины, ее недоступность в сети, а также отсутствие нужных привилегий у процесса.
Рассмотренные выше функции возвращают одинаковые значения. При удачном выполнении мы имеем ненулевое значение, в противном случае — ноль, а для более подробной информации следует использовать функцию GetLastError(). Надеюсь, что краткий обзор средств Windows API по программному завершению работы системы поможет использовать эти средства в ваших приложениях. Если же у вас возникли вопросы или предложения, то пишите.
Новик Павел, novek@hotbox.ru
Функция ExitWindowsEx() завершает сеанс пользователя, перезагружает или выключает машину. Она посылает сообщение WM_QUERYENDSESSION всем приложениям, работающим на машине в данный момент, для того чтобы определить, могут они быть закрыты или нет. Объявление функции выглядит следующим образом: BOOL ExitWindowsEx (UINT uFlags, DWORD dwReserved). Первый параметр является операцией, которую мы хотим произвести. Он может принимать следующие значения: EWX_LOGOFF — завершить сеанс пользователя, EWX_POWEROFF — выключить питание машины (причем система должна поддерживать эту операцию программно), EWX_REBOOT — перезагрузить ОС, EWX_SHUTDOWN — привести систему в состояние, когда можно безопасно выключить питание машины (в Windows 9x этот параметр отключает питание, а в Windows 2000 он выводит сообщение о том, что мы можем "безболезненно" выключить компьютер сами). Кроме этого, первый параметр может включать такие значения, как EWX_FORCE и EWX_FORCEIFHUNG. Первое значение заставляет приложения завершаться "насильно". Когда установлен его флаг, система не посылает приложениям сообщения WM_QUERYENDSESSION и WM_ENDSESSION, что может стать причиной не сохранения данных некоторыми программами (изменения в документах и настройках не произойдут). Второе значение используется в Windows 2000. Оно заставляет приложения завершаться, когда те не реагируют на посланные сообщения, описанные выше. Если используется первое значение, то второе игнорируется.
Второй аргумент функции зарезервирован и может принимать любое значение, например NULL. Надо отметить, что если приложение должно работать в Windows NT или Windows 2000, то перед вызовом этой функции необходимо установить процессу привилегию SE_SHUTDOWN_NAME. Это очень важно, так как желаемого результата вы не получите, если процесс не обладает достаточными привилегиями. Функция ExitWindows() только завершает сеанс пользователя. У нее есть два параметра, которые зарезервированны и должны быть равны нулю.
Две последних функции можно использовать только в Windows NT или Windows 2000. Первая из них имеет объявление BOOL InitiateSystemShutdown(LPTSTR lpMachineName, LPTSTR lpMessage, DWORD dwTimeout, BOOL bForceAppsClosed, BOOL bRebootAfterShutdown). Первым параметром является указатель на строку, содержащую сетевое имя компьютера, для которого мы хотим выполнить эту функцию. Если же этот указатель NULL, то подразумевается локальный компьютер. Второй параметр — это указатель на строку, содержащую сообщение, которое увидит пользователь в диалоговом окне, появившемся после выполнения этой функции. Если сообщение не требуется, то этот параметр следует установить в NULL. Параметр dwTimeout задает промежуток времени (в секундах), в течение которого на экране будет находиться диалоговое окно, сообщающее о завершении работы компьютера. Также это промежуток, за который можно отменить завершение работы при помощи функции AbortSystemShutDown(). Если же параметр ноль, то диалоговое окно не выводится и отменить это действие нельзя. Четвертый параметр определяет потребность закрытия приложений с несохраненными данными. Если он TRUE, то подобные приложения закроются "насильно", в противном случае они попросят пользователя закрыть их вручную. Последний параметр этой функции определяет требование перегрузки компьютера сразу после завершения работы.
Последняя функция в нашем обзоре имеет объявление BOOL AbortSystemShutdown(LPTSTR lpMachineName). Она используется совместно с предыдущей функцией, когда требуется остановить процесс завершения работы. Ее параметр аналогичен одноименному параметру в функции InitiateSystemShutdown(). Использование данной функции имеет смысл только в том случае, если параметр dwTimeout в InitiateSystemShutdown() отличен от нуля. Надо отметить, что вызывающему процессу при использовании двух последних функций необходима установка привилегии SE_SHUTDOWN_NAME для локального компьютера и SE_REMOTE_SHUTDOWN_NAME — для удаленного. Наиболее распространенными причинами неудачной работы этих функций являются неправильное имя машины, ее недоступность в сети, а также отсутствие нужных привилегий у процесса.
Рассмотренные выше функции возвращают одинаковые значения. При удачном выполнении мы имеем ненулевое значение, в противном случае — ноль, а для более подробной информации следует использовать функцию GetLastError(). Надеюсь, что краткий обзор средств Windows API по программному завершению работы системы поможет использовать эти средства в ваших приложениях. Если же у вас возникли вопросы или предложения, то пишите.
Новик Павел, novek@hotbox.ru
Компьютерная газета. Статья была опубликована в номере 09 за 2002 год в рубрике soft :: системные программы