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