Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Перезагрузка


Автор: Alex 12.9.2004, 15:53
Нужен исходник корректной перезагрузки любой винды. Чтобы перезагрузка ни чем не отличалась от той, что вызывается через пуск.

Автор: Pakshin A. S. 12.9.2004, 16:24
http://forum.vingrad.ru/index.php?showtopic=29431
Здесь несколько выриантов перезагрузки в том числе для NT-подобных Win'ов.

Автор: Pakshin A. S. 12.9.2004, 16:37
Ещё почти того же, но распростаненней:
Цитата

shutdown / reboot / logoff Windows 9x/NT/Me/2000/XP? 
Autor: NeuralAbyss Software 
Homepage: http://www.neuralabyss.com


Код

{1.}

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;

// Example to shutdown Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
 MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;

// Example to reboot Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
 MyExitWindows(EWX_REBOOT or EWX_FORCE);
end;


// Parameters for MyExitWindows()


{************************************************************************}

{2. Console Shutdown Demo}

program Shutdown;
{$APPTYPE CONSOLE}

uses
 SysUtils,
 Windows;

// Shutdown Program
// (c) 2000 NeuralAbyss Software
// www.neuralabyss.com

var
 logoff: Boolean = False;
 reboot: Boolean = False;
 warn: Boolean = False;
 downQuick: Boolean = False;
 cancelShutdown: Boolean = False;
 powerOff: Boolean = False;
 timeDelay: Integer = 0;

function HasParam(Opt: Char): Boolean;
var
 x: Integer;
begin
 Result := False;
 for x := 1 to ParamCount do
   if (ParamStr(x) = '-' + opt) or (ParamStr(x) = '/' + opt) then Result := True;
end;

function GetErrorstring: string;
var
 lz: Cardinal;
 err: array[0..512] of Char;
begin
 lz := GetLastError;
 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @err, 512, nil);
 Result := string(err);
end;

procedure DoShutdown;
var
 rl, flgs: Cardinal;
 hToken: Cardinal;
 tkp: TOKEN_PRIVILEGES;
begin
 flgs := 0;
 if downQuick then flgs := flgs or EWX_FORCE;
 if not reboot then flgs := flgs or EWX_SHUTDOWN;
 if reboot then flgs := flgs or EWX_REBOOT;
 if poweroff and (not reboot) then flgs := flgs or EWX_POWEROFF;
 if logoff then flgs := (flgs and (not (EWX_REBOOT or EWX_SHUTDOWN or EWX_POWEROFF))) or
     EWX_LOGOFF;
 if Win32Platform = VER_PLATFORM_WIN32_NT then
 begin
   if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
     hToken) then
     Writeln('Cannot open process token. [' + GetErrorstring + ']')
   else
   begin
     if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
     begin
       tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
       tkp.PrivilegeCount           := 1;
       AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
       if GetLastError <> ERROR_SUCCESS then
         Writeln('Error adjusting process privileges.');
     end
     else
       Writeln('Cannot find privilege value. [' + GetErrorstring + ']');
   end;
   {   if CancelShutdown then
         if AbortSystemShutdown(nil) = False then
           Writeln(\'Cannot abort. [\' + GetErrorstring + \']\')
         else
          Writeln(\'Cancelled.\')
      else
      begin
        if InitiateSystemShutdown(nil, nil, timeDelay, downQuick, Reboot) = False then
           Writeln(\'Cannot go down. [\' + GetErrorstring + \']\')
        else
           Writeln(\'Shutting down!\');
      end;
   }
 end;
 //     else begin
 ExitWindowsEx(flgs, 0);
 //     end;
end;

begin
 Writeln('Shutdown v0.3 for Win32 (similar to the Linux version)');
 Writeln('(c) 2000 NeuralAbyss Software. All Rights Reserved.');
 if HasParam('?') or (ParamCount = 0) then
 begin
   Writeln('Usage:    shutdown [-akrhfnc] [-t secs]');
   Writeln('                  -k:      don''t really shutdown, only warn.');
   Writeln('                  -r:      reboot after shutdown.');
   Writeln('                  -h:      halt after shutdown.');
   Writeln('                  -p:      power off after shutdown');
   Writeln('                  -l:      log off only');
   Writeln('                  -n:      kill apps that don''t want to die.');
   Writeln('                  -c:      cancel a running shutdown.');
 end
 else
 begin
   if HasParam('k') then warn := True;
   if HasParam('r') then reboot := True;
   if HasParam('h') and reboot then
   begin
     Writeln('Error: Cannot specify -r and -h parameters together!');
     Exit;
   end;
   if HasParam('h') then reboot := False;
   if HasParam('n') then downQuick := True;
   if HasParam('c') then cancelShutdown := True;
   if HasParam('p') then powerOff := True;
   if HasParam('l') then logoff := True;
   DoShutdown;
 end;
end.





 
// Parameters for MyExitWindows()


EWX_LOGOFF

Shuts down all processes running in the security context of the process that called the
ExitWindowsEx function. Then it logs the user off.

Alle Prozesse des Benutzers werden beendet, danach wird der Benutzer abgemeldet.

EWX_POWEROFF

Shuts down the system and turns off the power.
The system must support the power-off feature.
Windows NT/2000/XP:
The calling process must have the SE_SHUTDOWN_NAME privilege.

Fдhrt Windows herunter und setzt den Computer in den StandBy-Modus,
sofern von der Hardware unterstьtzt.

EWX_REBOOT

Shuts down the system and then restarts the system.
Windows NT/2000/XP: The calling process must have the SE_SHUTDOWN_NAME privilege.

Fдhrt Windows herunter und startet es neu.

EWX_SHUTDOWN

Shuts down the system to a point at which it is safe to turn off the power.
All file buffers have been flushed to disk, and all running processes have stopped.
If the system supports the power-off feature, the power is also turned off.
Windows NT/2000/XP: The calling process must have the SE_SHUTDOWN_NAME privilege.

Fдhrt Windows herunter.

 
EWX_FORCE

Forces processes to terminate. When this flag is set,
the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages.
This can cause the applications to lose data.
Therefore, you should only use this flag in an emergency.

Die aktiven Prozesse werden zwangsweise und ohne Rьckfrage beendet.

EWX_FORCEIFHUNG

Windows 2000/XP: Forces processes to terminate if they do not respond to the
WM_QUERYENDSESSION or WM_ENDSESSION message. This flag is ignored if EWX_FORCE is used.

Windows 2000/XP: Die aktiven Prozesse werden aufgefordert, sich selbst zu beenden und
mьssen dies bestдtigen. Reagieren sie nicht, werden sie zwangsweise beendet.

Автор: Alex 12.9.2004, 21:42
Сенькс smile.gif

Автор: Pakshin A. S. 12.9.2004, 22:03
Всегда рад помочь кодом или оветом... biggrin.gif

Черкни, если вариант с http://swissdelphicenter.ch/en/ пройдёт по XP без ошибок... smile.gif

Автор: Alex 12.9.2004, 23:35
1 вариант нормально работает под ХР.
2 вариант не проверял.

Автор: Pakshin A. S. 13.9.2004, 18:42
Спасибо за инфу...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)