rt

解决方案 »

  1.   

    function IsWin9x: Boolean;
    var
     OsInfo: TOSVERSIONINFO;
    begin
     OsInfo.dwOSVersionInfoSize := sizeof(TOSVERSIONINFO);
     GetVersionEx(OsInfo);
     Result := (OsInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS);
    end;function SetShutdownPrivilege(Enable: Boolean): Boolean;
    var
     PrevPrivileges: TTokenPrivileges;
     Privileges: TTokenPrivileges;
     Token: THandle;
     dwRetLen: DWord;
    begin
     Result := False;
     OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
     Privileges.PrivilegeCount := 1;
     if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', Privileges.Privileges[0].LUID) then
     begin
      if Enable then
       Privileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
      else
       Privileges.Privileges[0].Attributes := 0;
      dwRetLen := 0;
      Result := AdjustTokenPrivileges(Token, False, Privileges, SizeOf(PrevPrivileges), PrevPrivileges, dwRetLen);
     end;
     CloseHandle(Token);
    end;procedure Reboot;
    begin
     Application.Terminate;
     if IsWin9x then
      ExitWindowsEx(EWX_FORCE or EWX_REBOOT, 0)
     else
     begin
      SetShutdownPrivilege(True);
      ExitWindowsEx(EWX_FORCE or EWX_REBOOT, 0);
      SetShutdownPrivilege(False);
     end;
    end;procedure ShutDown;
    begin
     Application.Terminate;
     if IsWin9x then
      ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0)
     else
     begin
      SetShutdownPrivilege(True);
      ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0);
      SetShutdownPrivilege(False);
     end;
    end;
      

  2.   

    在Windows2000下关闭计算机function ShutDownSystem():BOOL;varhProcess,hAccessToken:THandle;LUID_AND_ATTRIBUTES:TLUIDAndAttributes;TOKEN_PRIVILEGES: TTokenPrivileges;BufferIsNull:DWORD;ConstSE_SHUTDOWN_NAME='SeShutdownPrivilege';beginhProcess:=GetCurrentProcess();OpenProcessToken(hprocess,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,hAccessToken);LookupPrivilegeValue(Nil,SE_SHUTDOWN_NAME,LUID_AND_ATTRIBUTES.Luid);LUID_AND_ATTRIBUTES.Attributes:=SE_PRIVILEGE_ENABLED;TOKEN_PRIVILEGES.PrivilegeCount:=1;TOKEN_PRIVILEGES.Privileges[0]:=LUID_AND_ATTRIBUTES;BufferIsNull:=0;AdjustTokenPrivileges(hAccessToken,False,TOKEN_PRIVILEGES,sizeof(TOKEN_PRIVILEGES),Nil,BufferIsNull);ExitWindowsEx(EWX_REBOOT, 0);ShutDownSystem:=True;end; 
     
      

  3.   

    同意: zhlwyy(海龙) 
    先检查系统,然后再用不同的函数实现:)