Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подводные камни при автоматическом выключении компьютера [D6, XP]


Dr. Genius ©   (2009-02-10 19:25:00) 

Написал для своих личных нужд небольшую программу, которая автоматически выключает компьютер в указанное время. Вот ее основной код:

 function MyExitWindows(const RebootParam: Longword): Boolean;
 var
   TTokenHd: THandle;
   TTokenPvg: TTokenPrivileges;
   cbtpPrevious: DWORD;
   rTTokenPvg: TTokenPrivileges;
   pcbtpPreviousRequired: DWORD;
   tpResult: Boolean;
 const
   SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
 begin
     tpResult := OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
       or TOKEN_QUERY, TTokenHd);
     if (tpResult) then
     begin
       tpResult := LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME,
         TTokenPvg.Privileges[0].Luid);
       TTokenPvg.PrivilegeCount := 1;
       TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
       cbtpPrevious := SizeOf(rTTokenPvg);
       pcbtpPreviousRequired := 0;
       if (tpResult) then
         Windows.AdjustTokenPrivileges(TTokenHd, False, TTokenPvg,
           cbtpPrevious, rTTokenPvg, pcbtpPreviousRequired);
     end;
   Result := ExitWindowsEx(RebootParam, 0);
 end;


Вызов:

MyExitWindows(EWX_POWEROFF or EWX_FORCE or EWX_FORCEIFHUNG);

А теперь такой вопрос. В каких случаях Windows будет препятствовать моей программе самоличному завершению работы компьютера? Я лично знаю только один из таких случаев – наличие активного удаленного соединения (в этом случае Windows не завершает работу компьютера, т.к. выводит диалоговое окно с запросом «отключиться или нет?»).

Решение этой конкретной проблемы я нашел – я просто программно отключаю все обнаруженные в системе соединения. Но хотелось бы узнать, какие еще подводные камни такого рода могут встречаться при автоматическом выключении компьютера?


Anatoly Podgoretsky   (2009-02-10 20:42:00) [1]

http://www.podgoretsky.com/ftp/Docs/Delphi/FAQ/ru.delphi.html#N161


kami   (2009-02-10 20:41:00) [2]

Наоборот, правильнее будет без EWX_FORCE но с EWX_FORCEIFHUNG


Anatoly Podgoretsky   (2009-02-10 20:40:00) [3]

> Fonts  (10.02.2009 19:45:04)  [4]

Такой же дурдом и непонимание принципов работы Виндоус, вилимо ты всегда вырубаешь Виндоус, путем выдергивания шнура.


Dr. Genius   (2009-02-10 19:52:00) [4]


> Так вот в "первоисточнике":
>
> MyExitWindows(EWX_POWEROFF or EWX_FORCE);


Я знаю, что так в первоисточнике. А что, без EWX_FORCEIFHUNG будет правильнее?


Fonts   (2009-02-10 19:45:00) [5]

> Dr. Genius   (10.02.09 19:25)

Рискну предположить, что это не совсем ты написал эту функцию, у меня почему-то оказалась точно такая же, в таком же контексте (выключаю компьютер по времени, когда смотрю фильм и могу заснуть и даже понимает выключить после нуля часов). А я ее сам не писАл, а где-то скачал. Так вот в "первоисточнике":

MyExitWindows(EWX_POWEROFF or EWX_FORCE);


Anatoly Podgoretsky   (2009-02-10 19:40:00) [6]

> Dr. Genius  (10.02.2009 19:32:02)  [2]

Работает ни и ладно, только ты почему то пришел на форум с проблемой.


Dr. Genius   (2009-02-10 19:32:00) [7]


> Обсуждать случае нет смысла, поскольку здесь написана полная
> ерунда


Почему вы так считаете. Код нормально работает.


Anatoly Podgoretsky   (2009-02-10 19:30:00) [8]

> Dr. Genius  (10.02.2009 19:25:00)  [0]

Обсуждать случае нет смысла, поскольку здесь написана полная ерунда - MyExitWindows(EWX_POWEROFF or EWX_FORCE or EWX_FORCEIFHUNG);


Наверх

Титульная страница Поиск, карта сайта Написать письмо