Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.05.2008, 22:06
Чипырик Чипырик вне форума
Прохожий
 
Регистрация: 14.04.2008
Сообщения: 22
Репутация: 10
По умолчанию Выключение компа(битье процессов)

Здраствуйте. Как мне выеключить компьютер, чтобы он просто выключился и все (без всяческих вопросов и т.п.)
На сайте "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  
Старый 05.05.2008, 22:16
Чипырик Чипырик вне форума
Прохожий
 
Регистрация: 14.04.2008
Сообщения: 22
Репутация: 10
По умолчанию

2 Admin
Звиняюсь
Ответить с цитированием
  #3  
Старый 06.05.2008, 11:50
Аватар для moo2k
moo2k moo2k вне форума
Активный
 
Регистрация: 05.12.2006
Адрес: где-то там...
Сообщения: 321
Репутация: 35
По умолчанию

Код:
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  
Старый 06.05.2008, 14:24
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Используй функцию 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  
Старый 06.05.2008, 19:46
Чипырик Чипырик вне форума
Прохожий
 
Регистрация: 14.04.2008
Сообщения: 22
Репутация: 10
По умолчанию

2 moo2k
Это я уже пробовал... Процессы не бьются.

2Thrasher
пробовал ExitWindowsEx(EWX_FORCE, 0) не катит... тоже самное и плюс комп не вырубается, а завершается только сеанс
Ответить с цитированием
  #6  
Старый 06.05.2008, 20:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Так тебе надо комп выключить или процессы убить?
Ответить с цитированием
  #7  
Старый 07.05.2008, 07:36
Чипырик Чипырик вне форума
Прохожий
 
Регистрация: 14.04.2008
Сообщения: 22
Репутация: 10
По умолчанию

Ну насколько я понял.
Перед выключением компьютера система опрашивает все запущенные приложения (процессы) на предмет их завершения. Они в свою очередь отвечают тем или иным образом. Некоторые сами закрываются, а некоторые требуют, например, чтобы юзер сохранил файл и т.п.

Мне нужно, чтобы комп просто выключился и все... без каких-либо вопросов. (а это, наверное, достигается путем принудительного закрытия всех процессов в системе)
Ответить с цитированием
  #8  
Старый 07.05.2008, 10:23
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Блин... Моя невнимательность просто меня убивает!
В SDK написано, что ExitWindowsEx в WinNT только завершает сеанс! Для перезагрузки в WinNT необходимо использовать функцию AdjustTokenPrivileges, что было продемонстрировано в коде, что ты привёл. Для того чтобы Делфи понимала TShutdownEx, нужно после implementation дописать type TShutdownEx = class(Exception);

Так что код ты привел вполне работоспособен. Я даже его протестил. Правда на виртуальной машине, однако и она была выключена БЕЗ взяких вопросов.
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #9  
Старый 09.05.2008, 09:38
Чипырик Чипырик вне форума
Прохожий
 
Регистрация: 14.04.2008
Сообщения: 22
Репутация: 10
По умолчанию

Спасибо, зафурычило
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter