ExitWindows 是对当前登陆的用户操作;
ExitWindowsEx 才能实现关机
—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
             毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
  I := TI.Create(Nil);
I.Maxim := MaximStr;
—————————————————————————————————
       

解决方案 »

  1.   

    WIn95/98/ME
    0A  ExitWindowsEx(EWX_SHUTDOWN,0);
    WInNt/2000/xp
      ExitWindowsEx(EWX_SHUTDOWN,0);前首先要调用AdjustTokenPrivileges是当前进程获得SE_SHUTDOWN_NAME权限。如果已超级用户登陆系统,本身具有SE_SHUTDOWN_NAME权限,不需要调用AdjustTokenPrivileges。—————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    if Not Assigned(I) then
      I := TI.Create(Nil);
    I.Maxim := MaximStr;
    —————————————————————————————————
           
      

  2.   

    用 
    ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE,0);就强行关机了
    ================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★  浏览帖子速度极快![建议系统使用ie5.5以上]。 ★  多种帖子实现界面。 
    ★  保存帖子到本地[html格式]★  监视您关注帖子的回复更新。
    ★  可以直接发贴、回复帖子★  采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录! 
    ★  支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名  ●  
         可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
    Http://www.ChinaOK.net/csdn/csdn.rar
    Http://www.ChinaOK.net/csdn/csdn.exe    [自解压]
      

  3.   

    听说是对于NT构架的操作系统是要求有权限的,没人关机的权限是不可以关机的。
    下面是我根据BCB的代码请自己转换。HANDLE hToken;
    TOKEN_PRIVILEGES
    OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);
    tkp.PrivilegeCount=1;
    tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken,false,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
    ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);
      

  4.   

    hToken是哪里声明的?
    delphi里面怎么找不到呢?
      

  5.   

    还有PTOKEN_PRIVILEGES,delphi也说不认识
      

  6.   

    function SetPrivilege(aPrivilegeName: string;
      aEnabled: 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(aPrivilegeName), TP.Privileges[0].LUID)) then
      begin
        if (aEnabled) then
          TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        else
          TP.Privileges[0].Attributes := 0;
        dwRetLen := 0;
        Result := AdjustTokenPrivileges(Token, False, TP, SizeOf(TPPrev),
          TPPrev, dwRetLen);
      end;
      CloseHandle(Token);
    end;function WinExit(iFlags: integer): boolean;
    //   possible Flags:
    //   EWX_LOGOFF
    //   EWX_REBOOT
    //   EWX_SHUTDOWN
    begin
      Result := True;
      if (SetPrivilege('SeShutdownPrivilege', true)) then
      begin
        if (not ExitWindowsEx(iFlags, 0)) then
          Result := False;
        SetPrivilege('SeShutdownPrivilege', False)
      end
      else
        Result := False;
    end;
      

  7.   

    For windows 9x/nt/2000/xp
    procedure PowerOff;
    var
      hToken       : THandle;
      tkp          : TTokenPrivileges;
      tkpo         : TTokenPrivileges;
      zero         : DWORD;
    begin
      if Win32Platform = VER_PLATFORM_WIN32_NT then // we've got to do a whole buch of things
         begin
            zero := 0;
            if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
               begin
                 MessageBox( 0, 'PowerOff Error', 'OpenProcessToken() Failed', MB_OK );
                 Exit;
               end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
            if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
               begin
                 MessageBox( 0, 'PowerOff Error', 'OpenProcessToken() Failed', MB_OK );
                 Exit;
               end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
            // SE_SHUTDOWN_NAME
            if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then
               begin
                  MessageBox( 0, 'PowerOff Error', 'LookupPrivilegeValue() Failed', MB_OK );
                  Exit;
               end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )
            tkp.PrivilegeCount := 1;
            tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;        AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );
            if Boolean( GetLastError() ) then
               begin
                  MessageBox( 0, 'PowerOff Error', 'AdjustTokenPrivileges() Failed', MB_OK );
                  Exit;
               end // if Boolean( GetLastError() )
            else
               ExitWindowsEx( EWX_POWEROFF, 0 );
          end // if OSVersion = 'Windows NT'
       else
          begin // just shut the machine down
            ExitWindowsEx( EWX_POWEROFF, 0 );
          end; // else
    end;
      

  8.   

    可是为什么 98 第二版 下单纯用 exitwindowsex(EWX_POWEROFF)会变成注销呢?
      

  9.   

    在NT、2000下重启电脑和关机的函数(转贴)
    procedure reboot_computer;
    var
            hToken:THandle;
            tkp : TOKEN_PRIVILEGES;
            ReturnLength : DWord;
    begin        if (not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_ALL_ACCESS or  TOKEN_QUERY, hToken))then
            begin
                    application.Terminate;
            end;
            LookupPrivilegeValue(nil,’SeShutdownPrivilege’,tkp.Privileges[0].Luid);
            tkp.PrivilegeCount := 1;
            tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED;
            ReturnLength :=0;
            AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil,ReturnLength);
            if (GetLastError() <> ERROR_SUCCESS) then
            begin
                                   application.Terminate;
            end;        if (not ExitWindowsEx(EWX_REBOOT, 0)) then
            begin
                                   application.Terminate;
            end;
    end;
      

  10.   

    try to use
    ExitWindowsEx( EWX_SHUTDOWN, 0 );
    in win98se
    or try this:
    winexec('Rundll32.exe','user,exitwindows',0); //not test by me
    if all actions failed then should be your system error