(page requirements)

Log off, shut down, restart, or reboot

Some programs require Windows to be restarted once it is installed on the system for the first time. If your program has a similar need, you could use the following function -- WinExit() -- to shut down Windows, restart Windows, or log off the current user from Windows.

function SetPrivilege(
  sPrivilegeName : string;
  bEnabled : 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( sPrivilegeName ),
        TP.Privileges[ 0 ].LUID ) )then
  begin
    if( bEnabled )then
    begin
      TP.Privileges[ 0 ].Attributes  :=
        SE_PRIVILEGE_ENABLED;
    end else
    begin
      TP.Privileges[ 0 ].Attributes  :=
        0;
    end;

    dwRetLen := 0;
    Result := AdjustTokenPrivileges(
                Token,
                False,
                TP,
                SizeOf( TPPrev ),
                TPPrev,
                dwRetLen );
  end;

  CloseHandle( Token );
end;

//
// iFlags:
//
//  one of the following must be
//  specified
//
//   EWX_LOGOFF
//   EWX_REBOOT
//   EWX_SHUTDOWN
//
//  following attributes may be
//  combined with above flags
//
//   EWX_POWEROFF
//   EWX_FORCE    : terminate processes
//
function WinExit( iFlags : integer ) : boolean;
begin
  Result := True;
  if( SetPrivilege( 'SeShutdownPrivilege', True ) )then
  begin
    if( not ExitWindowsEx( iFlags, 0 ) )then
    begin
      // handle errors...
      Result := False;
    end;
    SetPrivilege( 'SeShutdownPrivilege', False )
  end else
  begin
    // handle errors...
    Result := False;
  end;
end;

WinExit() function was desinged to be used with 32 bit Windows programs (Win32) and it does not support restarting Windows without rebooting or logging off. If you're writing a program that will be run under Windows 3.x or Windows 95 and you want to restart windows without rebooting the machine (after installing device drivers, for example), you can use ExitWindows() Win16 function (don't forget to add WinProcs and WinTypes units to your uses section):

ExitWindows( EW_RESTARTWINDOWS, 0 );

 
 
Applicable Keywords : Delphi, Delphi 1.x, Delphi 2.x, Functions, Win32
 
 
 
Copyright © 2009 Chami.com. All Rights Reserved. | Advertise | Created in HTML Kit editor