调用下面的WindowsAPI 可实现 
BOOL ExitWindowsEx(
  UINT uFlags,       // shutdown operation
  DWORD dwReserved   // reserved
);uFlags的取值根据要求而定,比如:EWX_POWEROFF|EWX_FORCE 可强制关闭电源,具体的参数
取值请参照Visual C++的MSDN。
  

解决方案 »

  1.   

    用ExitWindowsEx( EWX_SHUTDOWN | EWX_FORCE, 0);就行了!
      

  2.   

    如果是NT下,就复杂多了,下面是一个NT下重启的例子(首先你要有关机的权限):
    BOOL RebootNT()
    {
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp; //SeShutDownPrivilege must be enabled
    if (!OpenProcessToken(GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
    return FALSE; //Get a LUID for SeShutdownPrivilege
    LookupPrivilegeValue(NULL,TEXT("SeShutdownPrivilege"),
                                  &tkp.Privileges[0].Luid); //PrivilegeCount enables  more than one privilege to bo set
    tkp.PrivilegeCount=1;
    tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; //应该用下面的代码来确定AdjustTokenPrivileges执行是否成功。
    AdjustTokenPrivileges(hToken,false,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0)
    if (GetLastError() != ERROR_SUCCESS) 
             ErrorHandler("权限调整失败.");  //exit windows ,and then restart system
    ExitWindowsEx(EWX_SHUTDOWN|EWX_REBOOT,0); return TRUE;
    }拿去读吧。
      

  3.   

    我想你需要的这样一段程序。
    //shut down computer
    static HANDLE hToken;
    static TOKEN_PRIVILEGES tp;
    static LUID luid;
    if (::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
    {
    ::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
    tp.PrivilegeCount =1;
    tp.Privileges[0].Luid=luid;
    tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
    ::AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
    }
    ::InitiateSystemShutdown("","  The computer will shutdown.",30,FALSE,FALSE);会出现一个对话框,你将有30秒时间决定是否要关机。
    //cancel shut down
    ::AbortSystemShutdown("");