Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: WinShutdown per Aufgabenplanung

  Alt 27. Nov 2015, 08:40
Deine Routine gibt beim Ausführen entweder ein True zurück, oder es wird eine Exception geworfen.

Wenn es aber nur einen möglichen Wert gibt, warum gebe ich den Wert dann zurück?

Eine Exception unterbricht ausserdem die weitere Code-Ausführung.

Mit diesen beiden Erkenntnissen lässt sich dein Code erheblich verschlanken:
Delphi-Quellcode:
procedure Win32CheckSuccess(AResult : DWORD);
begin
  if AResult <> ERROR_SUCCESS then
    RaiseLastOSError;
end;

procedure WindowsShutDown( Computer: PChar; Msg: PChar; Time: Word; Force: Boolean; Reboot: Boolean );
var
  rl : Cardinal;
  hToken: Cardinal;
  tkp : TOKEN_PRIVILEGES;
  flags : DWORD;
begin
  Win32Check( OpenProcessToken( GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken ) );
  Win32Check( LookupPrivilegeValue( nil, 'SeShutdownPrivilege', tkp.Privileges[ 0 ].Luid ) );

  tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
  tkp.PrivilegeCount := 1;

  Win32Check( AdjustTokenPrivileges( hToken, False, tkp, 0, nil, rl ) );

  if Win32MajorVersion >= 6
  then
    begin
      // Flags
      if Reboot
      then
        flags := SHUTDOWN_FORCE_SELF or SHUTDOWN_GRACE_OVERRIDE or SHUTDOWN_RESTART
      else
        flags := SHUTDOWN_FORCE_SELF or SHUTDOWN_GRACE_OVERRIDE or SHUTDOWN_INSTALL_UPDATES;

      // Befehl ausführen
      Win32CheckSuccess( InitiateShutdown( Computer, Msg, Time, flags, 0 ) );
    end
  else
    Win32Check( InitiateSystemShutdown( Computer, Msg, Time, Force, Reboot ) );
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat