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)