![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 - зарезервировано. Этот параметр игнорируется |
|
#5
|
|||
|
|||
|
2 moo2k
Это я уже пробовал... Процессы не бьются. 2Thrasher пробовал ExitWindowsEx(EWX_FORCE, 0) не катит... тоже самное и плюс комп не вырубается, а завершается только сеанс |
|
#6
|
|||
|
|||
|
Так тебе надо комп выключить или процессы убить?
|
|
#7
|
|||
|
|||
|
Ну насколько я понял.
Перед выключением компьютера система опрашивает все запущенные приложения (процессы) на предмет их завершения. Они в свою очередь отвечают тем или иным образом. Некоторые сами закрываются, а некоторые требуют, например, чтобы юзер сохранил файл и т.п. Мне нужно, чтобы комп просто выключился и все... без каких-либо вопросов. (а это, наверное, достигается путем принудительного закрытия всех процессов в системе) |
|
#8
|
||||
|
||||
|
Блин... Моя невнимательность просто меня убивает!
В SDK написано, что ExitWindowsEx в WinNT только завершает сеанс! Для перезагрузки в WinNT необходимо использовать функцию AdjustTokenPrivileges, что было продемонстрировано в коде, что ты привёл. Для того чтобы Делфи понимала TShutdownEx, нужно после implementation дописать type TShutdownEx = class(Exception); Так что код ты привел вполне работоспособен. Я даже его протестил. Правда на виртуальной машине, однако и она была выключена БЕЗ взяких вопросов. |
|
#9
|
|||
|
|||
|
Спасибо, зафурычило
|