Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2008, 13:32   #1
Vladimir K.
Пользователь
 
Регистрация: 25.12.2006
Сообщений: 64
По умолчанию Как перезагрузить компьютер? В Win'XP.

Подскажите, как программно перезагрузить компьютер, особенно если одна или несколько задач отказываются завеpшить pаботу?
Использую Win'XP со всеми правами.
Vladimir K. вне форума Ответить с цитированием
Старый 17.02.2008, 16:35   #2
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  hToken: THandle;
  tkp: TTokenPrivileges;
  ReturnLength: Cardinal;
begin
  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_REBOOT, 0);
  end;
end;
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 17.02.2008, 19:49   #3
BanDit
Пользователь
 
Аватар для BanDit
 
Регистрация: 26.05.2007
Сообщений: 58
По умолчанию

Можно еще так:
Код:
function MyExitWindows(RebootParam: Longword): Boolean;  
var  
  TTokenHd: THandle;  
  TTokenPvg: TTokenPrivileges;  
  cbtpPrevious: DWORD;  
  rTTokenPvg: TTokenPrivileges;  
  pcbtpPreviousRequired: DWORD;  
  tpResult: Boolean;  
const  
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';  
begin  
  if Win32Platform = VER_PLATFORM_WIN32_NT then  
  begin  
    tpResult := OpenProcessToken(GetCurrentProcess(),  
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,  
      TTokenHd);  
    if tpResult then  
    begin  
      tpResult := LookupPrivilegeValue(nil,  
                                       SE_SHUTDOWN_NAME,  
                                       TTokenPvg.Privileges[0].Luid);  
      TTokenPvg.PrivilegeCount := 1;  
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;  
      cbtpPrevious := SizeOf(rTTokenPvg);  
      pcbtpPreviousRequired := 0;  
      if tpResult then  
        Windows.AdjustTokenPrivileges(TTokenHd,  
                                      False,  
                                      TTokenPvg,  
                                      cbtpPrevious, 
                                      rTTokenPvg, 
                                      pcbtpPreviousRequired); 
    end; 
  end; 
  Result := ExitWindowsEx(RebootParam, 0);
end; 

//Выключение
procedure TForm1.Button18Click(Sender: TObject);
begin
 MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;
BanDit вне форума Ответить с цитированием
Старый 17.02.2008, 23:49   #4
Vladimir K.
Пользователь
 
Регистрация: 25.12.2006
Сообщений: 64
По умолчанию

Terran, ваш код перезагружает комп, но если какое-то приложение зависло, или требует подтверждения выхода, то перезагрузка не происходит.

BanDit, ваш код просто выключает комп, а мне нужна перезагрузка, с функцией завершения работы программ, которые отказываются завеpшить pаботу.

Попробую еще так:
MyExitWindows(EWX_REBOOT or EWX_FORCE);

Последний раз редактировалось Vladimir K.; 18.02.2008 в 00:31.
Vladimir K. вне форума Ответить с цитированием
Старый 18.02.2008, 01:02   #5
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Что бы перезагружало компьютер несмотря ни на что используй команду:

ExitWindowsEX(EWX_FORCE, 0);
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 18.02.2008, 08:44   #6
Vladimir K.
Пользователь
 
Регистрация: 25.12.2006
Сообщений: 64
По умолчанию

ExitWindowsEX(EWX_FORCE, 0); - просто завершает текущий сеанс работы, потом, при загрузке, требуется выбрать пользователя - даже если он один.

Пробую код, приведенный BanDit, только функцию вызываю так:

MyExitWindows(EWX_REBOOT or EWX_FORCE);

Вроде работает нормально, но я еще не успел проверить безупречное срабатывание перезагрузки при всевозможных ошибках.
Vladimir K. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программо перезагрузить windоws. Da$aD Помощь студентам 8 24.04.2008 23:58
как выключить/перезагрузить компьютер motaro Паскаль, Turbo Pascal, PascalABC.NET 1 28.03.2008 02:01
Безопасная связка компьютер-компьютер, как организовать наилучшую защиту Alar Операционные системы общие вопросы 3 17.02.2008 21:15
Как програмно перезагрузить компьютер? Bill Gates Win Api 1 04.01.2008 17:32
Мой новогодний компьютер meg33 Свободное общение 2 27.12.2007 16:16