| 
| 
 | Вопрос # 1 958/ вопрос решён / | 
 |  Здравствуйте! Скажите пожалуйста, что нетак в коде программы( код приведен в приложении)? Должна выполниться перезагрузка компьютера! Но она не выполняется! Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ExtCtrls, StdCtrls; type  TForm1 = class(TForm)    Label1: TLabel;    Timer1: TTimer;    Label2: TLabel;    Label3: TLabel;    procedure FormActivate(Sender: TObject);    procedure Timer1Timer(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1;  a:integer;implementation {$R *.dfm} procedure TForm1.FormActivate(Sender: TObject);begina:=0;ShowWindow(Application.Handle, sw_Hide);end; procedure TForm1.Timer1Timer(Sender: TObject);begina:=a+1;case a of1: Label1.Caption:='20';2: Label1.Caption:='19';3: Label1.Caption:='18';4: Label1.Caption:='17';5: Label1.Caption:='16';6: Label1.Caption:='15';7: Label1.Caption:='14';8: Label1.Caption:='13';9: Label1.Caption:='12';10: Label1.Caption:='11';11: Label1.Caption:='10';12: Label1.Caption:='9';13: Label1.Caption:='8';14: Label1.Caption:='7';15: Label1.Caption:='6';16: Label1.Caption:='5';17: Label1.Caption:='4';18: Label1.Caption:='3';19: Label1.Caption:='2';20: Label1.Caption:='1';21: Label1.Caption:=''; 23: ExitWindowsEx(EWX_REBOOT,0); end;end; end.
|  |   Вопрос задал: Ученый (статус: 8-ой класс)Вопрос отправлен: 3 октября 2008, 09:38
 Состояние вопроса: решён, ответов: 3.
 |  Ответ #1. Отвечает эксперт: Шичко Игорь Здравствуйте, Ученый!Предлагаю Вам следующий код для перезагрузки.
 Источник:
 http://delphiworld.narod.ru/
 Приложение:Переключить в обычный режим var  ph: THandle;  tp, prevst: TTokenPrivileges;  rl: DWORD;begin  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, ph);  LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid);  tp.PrivilegeCount := 1;  tp.Privileges[0].Attributes := 2;  AdjustTokenPrivileges(ph, FALSE, tp, SizeOf(prevst), prevst, rl);  ExitWindowsEx(EWX_REBOOT,0);end;
|  | Ответ отправил: Шичко Игорь (статус: 9-ый класс)Время отправки: 3 октября 2008, 10:10
 Оценка за ответ: 5
 |  Ответ #2. Отвечает эксперт: Feniks Здравствуйте, Ученый!Ну когда же вы научитесь работать с поиском ? Ведь это очень просто, вводите имя функции и получаете несколько ссылок на вопросы по обсуждению данной темы. Например, вопрос #1848 прекрастно демонстрирует работу функций
 
 Function ExitWindows(Reserved: DWord; ReturnCode: Word): Boolean;и 
 Function ExitWindowsEx(uFlags: Word; dwReason: DWord): Boolean;Если вы сами не помежете понять, тогда смотрите пример в Приложении. Выкидываете глобал. переменную "a" и используете вместо нее Timer1.Tag. Данное свойство как раз и предназначено для разного рода хранения временных значений.
 В инспекторе объектов ставите этому свойству значение 20 и в таймере при каждом тике отнимаете до нуля.
 Как дошли до нуля, значит ребут. Вышеописанные функции ExitWindowsEx и ExitWindows действительны только для w9x/Me. Дело в том, что, чтобы выполнить функциию в NT ОС, нужно получить права на выполнение этой функции. Сделать это можно через AdjustTokenPriviligies. С помощью нижеприведённой функции можно получить любую привелегию, в т.ч. и привеленгию SeShutdownPrivilege, которая нужна для разрешения функции ExitWindows(Ex).
 
 P.S. Желаю удачи.
 Приложение:Переключить в обычный режим Function SetPrivilege(aPrivilegeName: String; aEnabled: 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(aPrivilegeName),TP.Privileges[0].LUID )) then Begin   IF aEnabled 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; procedure TForm1.Timer1Timer(Sender: TObject);begin    If Timer1.Tag > 0 Then      Timer1.Tag := Timer1.Tag - 1   else begin       SetPrivilege('SeShutdownPrivilege',True);      ExitWindowsEx(EWX_REBOOT,0);   end;end;
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 3 октября 2008, 10:21
 Оценка за ответ: 5
 |  Ответ #3. Отвечает эксперт: seryoga Здравствуйте, Ученый! попробуй так(код перенесён в приложение)
 Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ExtCtrls, StdCtrls; type  TForm1 = class(TForm)    Label1: TLabel;    Timer1: TTimer;    Label2: TLabel;    Label3: TLabel;    procedure FormActivate(Sender: TObject);    procedure Timer1Timer(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1;  a:integer;implementation {$R *.dfm}function SetPrivilege(aPrivilegeName: string;  aEnabled: 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(aPrivilegeName),    TP.Privileges[0].LUID)) then  begin    if (aEnabled) 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; function WinExit(iFlags: integer): boolean; //   EWX_LOGOFF//   EWX_REBOOT//   EWX_SHUTDOWNbegin  Result := True;  if (SetPrivilege('SeShutdownPrivilege', true)) then  begin    if (not ExitWindowsEx(iFlags, 0)) then    begin      Result := False;    end;    SetPrivilege('SeShutdownPrivilege', False)  end  else  begin    Result := False;  end;end;  procedure TForm1.FormActivate(Sender: TObject);begina:=0;ShowWindow(Application.Handle, sw_Hide);end; procedure TForm1.Timer1Timer(Sender: TObject);begina:=a+1;Label1.Caption:=inttostr(20-a);if a=20 then Winexit(EWX_REBOOT); end;end; end.
|  | Ответ отправил: seryoga (статус: 1-ый класс)Время отправки: 3 октября 2008, 10:58
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 5; последнее сообщение — 3 октября 2008, 11:15; участников в обсуждении: 3. 
|   | Шичко Игорь (статус: 9-ый класс), 3 октября 2008, 10:53 [#1]:to Feniks (пожелание) Мне кажется нужно более спокойно относится к вопросам посетителей, смотреть более философски. Все-таки мы (у которых спрашивают) немного больше лазили по информационным сайтам, немного больше сталкивались с разными ситуациями. И то что нам кажется элементарным и давно пройденным, для других это в диковинку. Достаточно вспомнить как мы сами начинали.
 Удачи во всем!
 |  
|   | Ученый (статус: 8-ой класс), 3 октября 2008, 10:58 [#2]:to Feniks. Набрал как вы и сказали: unit Unit1;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;
 
 type
 TForm1 = class(TForm)
 Label1: TLabel;
 Timer1: TTimer;
 Label2: TLabel;
 Label3: TLabel;
 procedure FormActivate(Sender: TObject);
 procedure Timer1Timer(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 Function SetPrivilege(aPrivilegeName: String; aEnabled: 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(aPrivilegeName),TP.Privileges[0].LUID )) then
 Begin
 IF aEnabled 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;
 
 
 procedure TForm1.FormActivate(Sender: TObject);
 begin
 
 ShowWindow(Application.Handle, sw_Hide);
 end;
 
 procedure TForm1.Timer1Timer(Sender: TObject);
 begin
 Label1.Caption := 'Îñòàëîñü äî ïåðåçàãðóçêè : ' + IntToStr(Timer1.Tag) + ' ñåê.';
 If Timer1.Tag > 0 Then
 Timer1.Tag := Timer1.Tag - 1
 else begin
 Label1.Caption:='Ïåðåçàãðóçêà, ïîäîæäèòå ...';
 SetPrivilege('SeShutdownPrivilege',True);
 ExitWindowsEx(EWX_REBOOT,0);
 
 end;
 
 end.
 Вылазит ошибка "types of actual and formal var parameters must be identical"!
 |  
|   | Feniks (статус: Бакалавр), 3 октября 2008, 11:10 [#3]:Да, действительно. Виноват. В строке: 
 OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, @Token);замените @Token на Token. И в следующей строке IF в конце лишнюю скобку тоже уберите.
   |  
|   | Feniks (статус: Бакалавр), 3 октября 2008, 11:12 [#4]:Эксперты тоже люди и могут ошибаться. От этого никто не застрахован. |  
|   | Ученый (статус: 8-ой класс), 3 октября 2008, 11:15 [#5]:Понятно! Я с вами полностью согласен! |  31 января 2011, 19:23: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |