|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Выключение компа(битье процессов)
Здраствуйте. Как мне выеключить компьютер, чтобы он просто выключился и все (без всяческих вопросов и т.п.)
На сайте "http://www.delphisources.ru/pages/faq/base/power_off_kill.html" нашел такой код: Код:
procedure Shutdown2; var hToken: THandle; tkp: _TOKEN_PRIVILEGES; DUMMY: PTokenPrivileges; DummyRL: Cardinal; begin DUMMY := nil; if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken ) then raise TShutdownEx.Create('OpenProcessToken failed'); if (not LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid)) then raise TShutdownEx.Create('LookupPrivilegeValue failed'); tkp.PrivilegeCount := 1; tkp.Privileges[0].Attributes := $0002; //SE_PRIVILEGE_ENABLED = $00002 AdjustTokenPrivileges(hToken, FALSE, tkp, 0, Dummy, DummyRL); if (GetLastError() <> ERROR_SUCCESS) then raise TShutdownEx.Create('AdjustTokenPrivileges failed'); if (not ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0)) then raise TShutdownEx.Create('ExitWindowsEx failed'); end; Admin: Используем теги для оформления кода, иначе санкции! Но Делфя ругается отчего-то на TShutdownEx. Грит не знаю таких букафф. Последний раз редактировалось Admin, 05.05.2008 в 22:11. |
#2
|
|||
|
|||
2 Admin
Звиняюсь |
#3
|
||||
|
||||
Код:
var ph: THandle; tp, prevst: TTokenPrivileges; rl: DWORD; begin OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, ph); LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid); tp.PrivilegeCount:= 1; tp.Privileges[0].Attributes:= 2; AdjustTokenPrivileges(ph, FALSE, tp, SizeOf(prevst), prevst, rl); ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0); Программирование - это искусство и наш смысл жизни. |
#4
|
||||
|
||||
Используй функцию ExitWindowsEx(uFlags:integer;Reserved:dword):boole an;
uFlags может принимать следующие значения: EWX_FORCE - быстрое завершение работы - программам не посылаются сообщения WM_QUERYENDSESSION and WM_ENDSESSION, что может привести к потере данных EWX_LOGOFF - завершить текущий сеанс EWX_POWEROFF - выключение питания EWX_REBOOT - перезвгрузка EWX_SHUTDOWN - спящий режим - когда всё замораживается, а при включении как-будто и не выключали. Reserved - зарезервировано. Этот параметр игнорируется Хорошо написанная программа не требует документации ICQ 9-184-668. |
#5
|
|||
|
|||
2 moo2k
Это я уже пробовал... Процессы не бьются. 2Thrasher пробовал ExitWindowsEx(EWX_FORCE, 0) не катит... тоже самное и плюс комп не вырубается, а завершается только сеанс |
#6
|
|||
|
|||
Так тебе надо комп выключить или процессы убить?
|
#7
|
|||
|
|||
Ну насколько я понял.
Перед выключением компьютера система опрашивает все запущенные приложения (процессы) на предмет их завершения. Они в свою очередь отвечают тем или иным образом. Некоторые сами закрываются, а некоторые требуют, например, чтобы юзер сохранил файл и т.п. Мне нужно, чтобы комп просто выключился и все... без каких-либо вопросов. (а это, наверное, достигается путем принудительного закрытия всех процессов в системе) |
#8
|
||||
|
||||
Блин... Моя невнимательность просто меня убивает!
В SDK написано, что ExitWindowsEx в WinNT только завершает сеанс! Для перезагрузки в WinNT необходимо использовать функцию AdjustTokenPrivileges, что было продемонстрировано в коде, что ты привёл. Для того чтобы Делфи понимала TShutdownEx, нужно после implementation дописать type TShutdownEx = class(Exception); Так что код ты привел вполне работоспособен. Я даже его протестил. Правда на виртуальной машине, однако и она была выключена БЕЗ взяких вопросов. Хорошо написанная программа не требует документации ICQ 9-184-668. |
#9
|
|||
|
|||
Спасибо, зафурычило
|