|
Вопрос # 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);
- begin
- a:=0;
- ShowWindow(Application.Handle, sw_Hide);
- end;
-
- procedure TForm1.Timer1Timer(Sender: TObject);
- begin
- a:=a+1;
- case a of
- 1: 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_SHUTDOWN
- begin
- 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);
- begin
- a:=0;
- ShowWindow(Application.Handle, sw_Hide);
- end;
-
- procedure TForm1.Timer1Timer(Sender: TObject);
- begin
- a:=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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|