Используйте WinAPI функцию ExitWindows(). В качестве первого параметра ей передается: EW_RESTARTWINDOWS , EW_REBOOTSYSTEM или EW_EXITANDEXECAPP
Второй параметр используется для перезагрузки компьютера в режиме эмуляции MS DOS.
Перезагрузка
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
ICQ 166585446
sergewiz@mail.ru
sergewiz@mail.ru
Для Delphi вроде uses ShellAPI; , а потом вызываешь. Это WinAPI функция
ICQ 166585446
sergewiz@mail.ru
sergewiz@mail.ru
SergeWiz, всё же все Win API функции в модуле Windows размещены.
Даже самый дурацкий замысел можно воплотить мастерски
И что это так всех на перезагрузку потянуло...
На этом форуме тема уже недавно обсуждалась. В Паскале тот второй способ должен сработать через inline. Что-то вроде:
PS - Это все если под ДОС. Иначе - ExitWindowsEx().

Код: Выделить всё
inline($EA/$00/$00/$FF/$FF);
-
- Сообщения: 12
- Зарегистрирован: 04 мар 2004, 15:35
- Откуда: Moscow, Russia
Вот код для выключение компьютера. Работает как на 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;
delphi-coder, для перезагрузки флаг EWX_REBOOT. И зачем два раза вызывать ExitWindowsEx? И еще: SetProcessShutdownParameters в Win9x нет, так что там не сработает. Лучше проверять версию Виндов и для 9x вызывать сразу ExitWindowsEx без запроса привилегий. В остальном - все верно 
