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

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

Как программно перегрузить компьютер? [D7]


Ната ©   (2005-01-21 07:52:00) 

ПОдскажите, пожалуйста, как программно перегрузить компьютер?


i-s-v   (2005-01-23 01:35:00) [1]

Полазь на http://delphiworld.narod.ru

---
The Death Will Come


grom   (2005-01-22 20:42:00) [2]

XP
...
procedure ...
var
 hToken: THandle;
 tkp: _TOKEN_PRIVILEGES;
 returnLength: Cardinal;
begin
// Windows.Beep(855,55);

   if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken)then
  begin
    LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
    tkp.PrivilegeCount:=1;
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    if AdjustTokenPrivileges(hToken,false,tkp,0,nil,returnLength)then ExitWindowsEx(EWX_SHUTDOWN or EWX_REBOOT,0);
  end;
end;


Dextor   (2005-01-22 20:30:00) [3]

Проще полистать FAQ на этом сайте, там как раз все написанно !


Вариант   (2005-01-22 18:29:00) [4]

Такой способ не убивает процессы:
procedure reboot;
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_REBOOT, 0)) then
   raise TShutdownEx.Create('ExitWindowsEx failed');
end;


VMcL   (2005-01-21 16:50:00) [5]

> Form1.Close;
> MessageBox(Form1.Handle...);

За такой код расстреливать надо.


onyx   (2005-01-21 11:52:00) [6]

Вот готовое решение. А то здесь трудно найти, то что нужно.

function WinExit : boolean;
var ver : OSVERSIONINFO;

function SetPrivilege(privilegeName: string; enable: boolean): boolean;
var tpPrev,
   tp         : TTokenPrivileges;
   token      : THandle;
   dwRetLen   : DWord;
begin
 result := False;
 OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token);
 tp.PrivilegeCount := 1;
 if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then
 begin
   if enable then
     tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
   else
     tp.Privileges[0].Attributes := 0;
   dwRetLen := 0;
   result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen);
 end;
 CloseHandle(token);
end;

BEGIN
 ver.dwOSVersionInfoSize:=SizeOf(ver);
 GetVersionEx(ver);
 if ver.dwPlatformId=VER_PLATFORM_WIN32_NT then
 begin
   if SetPrivilege('SeShutdownPrivilege', true) then
   begin
     Form1.Close;
     ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);
   end
   else
   begin
     Form1.Close;
     MessageBox(Form1.Handle, 'К сожалению перезагрузка не получилась!','info',MB_OK or MB_ICONWARNING or MB_SYSTEMMODAL);
   end;
 end
 else
 begin
   Form1.Close;
   ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0);
 end;
END;


Квэнди   (2005-01-21 09:04:00) [7]

а поискать в этом же форуме саавсем лень?


Наверх

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