你试试。unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);  private
    { Private declarations }
    procedure AdjustToken;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}procedure TForm1.AdjustToken();
var
  hdlProcessHandle : Cardinal;
  hdlTokenHandle : Cardinal;
  tmpLuid : Int64;
  tkpPrivilegeCount : Int64;
  tkp : TOKEN_PRIVILEGES;
  tkpNewButIgnored : TOKEN_PRIVILEGES;
  lBufferNeeded : Cardinal;
  Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;
begin
         hdlProcessHandle := GetCurrentProcess;
         OpenProcessToken(hdlProcessHandle,
                         (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),
                          hdlTokenHandle);         // Get the LUID for shutdown privilege.
         LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
         Privilege[0].Luid := tmpLuid;
         Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
         tkp.PrivilegeCount := 1;   // One privilege to set
         tkp.Privileges[0] := Privilege[0];
         // Enable the shutdown privilege in the access token of this
         // process.
         AdjustTokenPrivileges(hdlTokenHandle,
                               False,
                               tkp,
                               Sizeof(tkpNewButIgnored),
                               tkpNewButIgnored,
                               lBufferNeeded); end;
procedure TForm1.Button1Click(Sender: TObject);
begin
     AdjustToken;
     ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), $FFFF);
end;end.

解决方案 »

  1.   

    前几天就看到这个贴子了.料想各位专家的回答应该能解决你的问题了.谁知道竟是在98下运行.而且好像还没解决,真是冤煞了gjq2000先生! 还是给你讲讲我的经历吧,也许能给你一点启示.前一段时间我也写过关机的程序.也是有毛病.根据MSDN的说法:
    EWX_POWEROFF:关闭计算机,关闭电源.
    EWX_SHUTDOWN:关闭计算机,出现关机画面.
    EWX_REBOOT:重新启动.
    EWX_LOGOUT:注销用户.
    EWX_FORCE:强制退出.
    令人奇怪的是EWX_POWER关闭不了计算机.仅仅是注销而已.组合EWX_FORCE也不管用.反而是EWX_SHUTDOWN能关闭计算机.当时没怎没在意,后来在Experts-exchange上看到有人也碰到类似问题.有个鬼子解答说可能是MICROSOFT的Bugs,并且EWX_FORCE只能配合EWX_LOGOUT使用,配合其他的选项可能会是WINDOWS迷惑导致错乱.
    如果ExitWindowsEx(EWX_SHUTDOWN,0)关不掉你的计算机.建议你跟微软接受Bug报告的部门联系.
    到时别忘的把微软的解释告诉大家就是了.
      

  2.   

    同意楼上的,我也是用API:ExitWindowsEx(EWX_SHOWDOWN,0)来远程关机的.
      

  3.   

    哦,我想起来了,有另一种情况,
    那就是:
    你是不是用了xxUDP控件,
    使用的UDP协议
      

  4.   

    我也碰见过这种情况,我的木马服务端起来之后机子关不掉,我想不明白为什么,后来大概是网络控件的问题,最后我在 onclose里 强行exitprocess,就好了.
      

  5.   

    这样就OK了  public
        procedure exitwin(var msg:TWMQUERYENDSESSION);message WM_QUERYENDSESSION;
    procedure TForm1.exitwin(var msg: TWMQUERYENDSESSION);  //关机处理过程
    begin
       inherited;
       Form1.Close;
    end;
      

  6.   

    LeonSu可否告诉我你的机子是如何实现自动开机的呢?
    我对此很感兴趣。谢谢