Страница 1 из 2

Добавлено: 13 апр 2004, 05:59
SergeWiz
Используйте WinAPI функцию ExitWindows(). В качестве первого параметра ей передается: EW_RESTARTWINDOWS , EW_REBOOTSYSTEM или EW_EXITANDEXECAPP
Второй параметр используется для перезагрузки компьютера в режиме эмуляции MS DOS.

Добавлено: 16 апр 2004, 07:04
SergeWiz
Для Delphi вроде uses ShellAPI; , а потом вызываешь. Это WinAPI функция

Добавлено: 16 апр 2004, 11:44
AiK
SergeWiz, всё же все Win API функции в модуле Windows размещены.

Добавлено: 16 апр 2004, 19:52
Andy
И что это так всех на перезагрузку потянуло... :) На этом форуме тема уже недавно обсуждалась. В Паскале тот второй способ должен сработать через inline. Что-то вроде:

Код: Выделить всё

inline($EA/$00/$00/$FF/$FF);
PS - Это все если под ДОС. Иначе - ExitWindowsEx().

delphi-coder

Добавлено: 17 апр 2004, 13:03
delphi-coder
Вот код для выключение компьютера. Работает как на W9X, так и на NTях.

Код: Выделить всё

uses Windows, ShellApi;

var
  TokenHandle: Cardinal;
  RetLength: Cardinal;
  TP: TTokenPrivileges;

Procedure Shutdown();
begin
  ExitWindowsEx(EWX_POWEROFF, 0);
  OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle);
  if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', TP.Privileges[0].Luid) then begin
   TP.PrivilegeCount:=1;
   TP.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
   RetLength:=0;
    If AdjustTokenPrivileges(TokenHandle, FALSE, TP, 0, nil, RetLength) then begin
     If not SetProcessShutdownParameters($4FF,SHUTDOWN_NORETRY) then begin
      MessageBox(0, 'Shutdown Failed', nil, MB_OK or MB_ICONSTOP);
      end;
       ExitWindowsEx(EWX_POWEROFF, 0);
       end;
     end;
end;

Добавлено: 17 апр 2004, 15:51
Eugie
delphi-coder, для перезагрузки флаг EWX_REBOOT. И зачем два раза вызывать ExitWindowsEx? И еще: SetProcessShutdownParameters в Win9x нет, так что там не сработает. Лучше проверять версию Виндов и для 9x вызывать сразу ExitWindowsEx без запроса привилегий. В остальном - все верно :)