![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подводные камни при автоматическом выключении компьютера [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);