请问各位大侠,如何在DELPHI 6中用函数实现WIN2000 的重新启动????,在线急等!!1

解决方案 »

  1.   

    ExitWindowsEx(0, 0)
    // 参数型及说明: uFlags Long,指定下述一个或多个标志(用OR运算符合并到一起) 
    // EWX_FORCE 强迫中止没有响应的进程 4
    // EWX_LOGOFF 中止进程,然后注销 0
    // EWX_SHUTDOWN 关掉系统电源(如果可能的话,ATX电源就可以) 1
    // EWX_REBOOT 重新引导系统 2
    // EWX_SHUTDOWN 关闭系统 1
    // dwReserved Long,保留,设为零
      

  2.   

    楼上说的不完整,还需要进行token权限设置的,否则为什么楼主要强调win2000呢?奉上代码一份:
    procedure TForm1.Button1Click(Sender: TObject);
    var tk:TTokenPrivileges;
        hToken: THandle;
        h: Dword;begin
       tk.PrivilegeCount:=1;
       tk.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
       LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tk.Privileges[0].luid);
       OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
       AdjustTokenPrivileges(hToken, False, tk, 0, PTokenPrivileges(nil)^, h);   ExitWindowsEx(0, 0)
    // 参数型及说明: uFlags Long,指定下述一个或多个标志(用OR运算符合并到一起) 
    // EWX_FORCE 强迫中止没有响应的进程 4
    // EWX_LOGOFF 中止进程,然后注销 0
    // EWX_SHUTDOWN 关掉系统电源(如果可能的话,ATX电源就可以) 1
    // EWX_REBOOT 重新引导系统 2
    // EWX_SHUTDOWN 关闭系统 1
    // dwReserved Long,保留,设为零   CloseHandle(hToken);
    end;
    呵呵,借楼上的一点儿光,楼上的,莫要见怪。
      

  3.   

    个人认为 比较ExitWindowsEx,InitiateSystemShutdownEx()来得更狠一些...
    嘿嘿.....
      

  4.   

    注意权限即可http://lysoft.7u7.net
      

  5.   

    转的
    调用:WinExit(EWX_REBOOT or EWX_FORCE);function WinExit(flags: integer): boolean;stdcall;//关闭计算机函数;
      function SetPrivilege(privilegeName: string; enable: 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(privilegeName), tp.Privileges[0].LUID) then
        begin
          if enable 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;
    begin
      if SetPrivilege('SeShutdownPrivilege', true) then begin
        ExitWindowsEx(flags, 0);
        SetPrivilege('SeShutdownPrivilege', False)
      end;
    end;
      

  6.   

    这里有几个小函数可能用得到:
    http://www.playicq.com/dispdocnew.php?id=20738{关闭计算机}
    function WinExit (iFlags: integer) : Boolean;
    {0:注销
     1:关闭计算机
     2:重新启动计算机
     4:强制注销(不保存状态)
     8:关闭电源
     16:注销}  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 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;begin
      Result:=False;
      if SetPrivilege ('SeShutdownPrivilege', true) then
      begin
        if  ExitWindowsEx(iFlags, 0) then result:=True;
        SetPrivilege ('SeShutdownPrivilege', False);
      end
    end;