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

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

Банально: Перезагрузка Windows [D7, Win2k, WinXP]


Terrible ©   (2003-12-18 18:43:00) 

Казалось бы эоементарно, нашёл кучу примеров, но не работает :( Прилагаю процедуру, которую я применяю сейчас, может кто нибудь посмотреть что я делаю не так.
Проблема в том, что она работает через раз (система WinXP), иногда перезагружает, иногда нет, на разных компьютерах ведёт себя по разному. В общем что то в неё не так

Procedure RebootSystem;
var
ver: TOSVERSIONINFO;
ph:THandle;
tp,prevst:TTokenPrivileges;
rl:DWORD;
begin
GetVersionEx(ver);
if ver.dwPlatformId=VER_PLATFORM_WIN32_NT then
begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,ph);
LookupPrivilegeValue(Nil,"SeShutdownPrivilege",tp.Privileges[0].Luid);
tp.PrivilegeCount:=1;
tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(ph,FALSE,tp,0,nil,rl);
InitiateSystemShutdown(nil,nil,0,true,true);
end
else begin
ExitWindowsEx(EWX_REBOOT, 0);
end;
end;


Holy   (2003-12-19 16:02:00) [1]


> Потому что на Win2000/XP это не работает :/

Работает.

procedure ShutDownNT(hibernate:boolean);
const
A_Priv=Token_Query or Token_Adjust_Privileges;
S_Priv="SeShutdownPrivilege";
Size=sizeOf(TTokenPrivileges);
var
T, Buf:TTokenPrivileges; Token:THandle; Len:dword;
begin
if hibernate then
begin WinExec("rundll32.exe powrprof.dll,SetSuspendState",1); exit; end;
// Добавляем процессу приоритет на завершение работы
OpenProcessToken(GetCurrentProcess(), A_Priv, Token);
LookupPrivilegeValue(nil, S_Priv,T.Privileges[0].Luid);
T.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
T.PrivilegeCount := 1;
AdjustTokenPrivileges(Token, false, T, Size, Buf, Len);
// Завершаем работу
ExitWindowsEx(EWX_PowerOFF,0);
end;

Код из плагина для винампа. Им пользуюсь я и несколько моих знакомых. Платформа - W2K SP - любой.


Terrible   (2003-12-19 12:13:00) [2]


> А почему бы для всех систем не вызывать ExitWindowsEx(EWX_REBOOT,
> 0), а не только для win9x

Потому что на Win2000/XP это не работает :/


Cash   (2003-12-19 11:39:00) [3]

Хм.м.м.м.м. Terribleпрогуляйся пониже(точнее ст 3-5), найдешь мой вопрос, там все дохотчево (комент. Вадим-а).


DVM   (2003-12-18 18:55:00) [4]

А почему бы для всех систем не вызывать ExitWindowsEx(EWX_REBOOT, 0), а не только для win9x


Наверх

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