static HANDLE hToken;
    static TOKEN_PRIVILEGES tp;
    static LUID luid;
    ::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);
    ::ExitWindowsEx(EWX_POWEROFF|EWX_FORCE, 0);

解决方案 »

  1.   

    HANDLE hToken;
        TOKEN_PRIVILEGES tkp;
    DWORD dwVersion;

    dwVersion = GetVersion(); //获得Windows NT或Win32的版本号 switch(IsHow)
    {
    case 0://注销
    ExitWindowsEx(EWX_LOGOFF,0);
    break; case 1://重新启动
    if (dwVersion < 0x80000000)  
    {// Windows NT系列
                OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
                LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1;  // 设置一个权限
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);            ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
    }
    else
    {//Windows 95系列
                ExitWindowsEx(EWX_FORCE | EWX_REBOOT,0);
    }
    break; case 2://关闭计算机
        if (dwVersion < 0x80000000) 
    {// Windows NT
        OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
                LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);            tkp.PrivilegeCount = 1;  // 设置一个权限
                tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);            ExitWindowsEx(EWX_POWEROFF |EWX_FORCE, 0);
    }
    else
    {
                ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN,0);
    }
    break;
        }
      

  2.   

    ::AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);->
    ::AdjustTokenPrivileges(hToken,FALSE,&tp,0,NULL,NULL);
                                             ^
    试试看行不行呀!实在不行,那就GetLastError看看好了
      

  3.   

    那最后一句再把EWX_SHUTDOWN招呼上吧
    ::ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF|EWX_FORCE, 0);
      

  4.   

    ::AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);->
    ::AdjustTokenPrivileges(hToken,FALSE,&tp,0,NULL,NULL);
                                             ^
    这个 改了  但不管参数如何为,只能重起机子!
    我用系统的关机 可以顺利关机!!!
    这是怎么回事,系统是刚装的!
      

  5.   

    加一句 InitiateSystemShutdown()
      

  6.   

    InitiateSystemShutdown()
    这一句干什么的?
      

  7.   

    第一步:
    动态加载powrprof.dll文件
    运行其中的IsPwrShutdownAllowed函数,取得返回值第二步:
    得到特权(NT5系统)第三步:
    返回为真,调用ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);
    返回为假,调用ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);
      

  8.   

    楼主我跟你一样哈!代码肯定是没错的,记得好象在哪看过要硬件支持什么的,我也郁闷啊!WIN98一下就关了。