Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > КаВыключить комп


Автор: Punk 7.6.2002, 04:26
как выключить комп чтобы Винда выгрузила ве сама не спрашивая что типа "Эту программу следует закрыть до завершения работы Виндовс"
Выгрузила все сама даже прогу которая закрывает Винду (кот надо написать)
и выключила комп

Автор: Vit 7.6.2002, 05:00
ExitWindowsEx(EWX_FORCE,0);

или

Запуск из коммандной строки

rundll32 krnl386.exe,exitkernel

только под XP все это работает плохо. Надо думать...

Автор: Song 7.6.2002, 08:05
Чтобы работало под XP, NT, 2000 надо получить соответсвующую привелегию, а именно SeShutDownPriviligie

2Vit, exitkernel очень радикальный способ  :D потому что не сохраняются настройки рабочего стола, ini файлы и другие установки, зато быстро :D

Есть способ намного лучше: ф-ия SHExitWindowsEx из shell32.dll
С неё всё good. Это запуск из-под WinExec()
Программно же только с получением привелегии.
Замечу также что флаг EWX_FORCE необходим только для принудительного завершения при выдаче каких либо сообщений или модальных окон, что воспрепятствует завершению, например, "К компьютеру подключены пользователи. Данные могут быть утярены. Вы хотите завершить работу?" или сообщение, которое автор указал в вопросе.
Если нет таких сообщений EWX_FORCE не обязателен. Также есть отдельные флаги для выключение компьютера (по умолчанию - перезагрузка) или завершения сетевого сеанса.

Автор: Vit 7.6.2002, 14:49
Цитата(Song @ 07.6.2002, 00:05)
Чтобы работало под XP, NT, 2000 надо получить соответсвующую привелегию, а именно SeShutDownPriviligie

Нет, в XP похоже не в этом дело, там почему-то "krnl386.exe" и "user.exe" вообще не распознаются как DLL. Наверное заглушка какая то стоит...

Автор: Song 7.6.2002, 15:19
Программно работает точно. Через rundll надо попробовать.

Автор: Vit 7.6.2002, 15:43
И програмно и через RunDLL под XP выдает одну и ту же ошибку, что то типа "Неправильный формат krnl32.exe", точное сообщение я напишу чуть позже - прийду домой запущу и напишу.

PS. Кстати когда у меня стоял 2000 то работали все эти функции как часы.

To Song:  если не веришь, напиши процедуру - я ее в точности выполню на своем компьютере и пришлю результат. Меня чесно говоря результат тоже удивил.


Автор: Song 7.6.2002, 16:33
Программно имеется ввиду WinExec(...rundll...) ?
Я-то имел ввиду ExitWindowsEx()

Автор: Vit 8.6.2002, 06:01
Exitwindows работает, а вот попытка обращения к любой процедуре из krnl32.exe и User32.exe хоть из программы, хоть через RunDLL вызывает на моем WinXP rus следующее сообщение, привожу дословно:


Приложение или библиотека krnl32.exe не является образом программы для Windows NT. Проверьте назначение текущего диска.


Ну и как это понимать?

Автор: RA 8.6.2002, 21:41
Ну я думаю (потому что лень проверять), что надо убить все активные процессы кроме Kernel32 (Тогда по идеи Виндовоз небудет сопротивляться) , ну а дольше ExitWindowsEx(EWX_FORCE,0);

Автор: Song 9.6.2002, 08:53
Цитата(RAdmin @ 08.6.2002, 22:41)
Ну я думаю (потому что лень проверять), что надо убить все активные процессы кроме Kernel32 (Тогда по идеи Виндовоз небудет сопротивляться) , ну а дольше ExitWindowsEx(EWX_FORCE,0);

ExitWindowsEx() сам всё убьёт.

2Vit, Наверно в XP шнягу через rundll просто убрали.

Автор: RA 9.6.2002, 09:11
Код
ExitWindowsEx() сам всё убьёт.

2 Song. Вот в XP может и убъёт, а в 9x-ME очень часто такая маза непроходит, пока не убъёшь какойнить процесс. (взято из личного опыта)

Автор: Song 9.6.2002, 09:29
Нет, это не нормальное поведение. ExitWindowsEx() должен выключать всё в любом случае. Если какой-то процесс подвисает, значит пора систему сносить.
В Win95/98 в подавляющем в большинстве случае вообще можно обойтись ExitWindows() просто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)