在VC6中用函数ExitWindowsEx(EWX_SHUTDOWN,0);关不了机怎么办?有没有更POWER的函数来SHUTDOWN COMPUTER?

解决方案 »

  1.   

    EWX_SHUTDOWN Shuts down the system to a point at which it is safe to turn off the power. All file buffers have been flushed to disk, and all running processes have stopped. If the system supports the power-off feature, the power is also turned off. 
    Windows NT/2000/XP: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Res section. 
      

  2.   

    Winexec("rundll32.exe user.exe,exitwindows",...);
      

  3.   

    typedef int (CALLBACK *SHUTDOWNDLG)(int);   //显示关机对话框函数的指针 HINSTANCE hInst = LoadLibrary("shell32.dll");  //装入shell32.dll
    SHUTDOWNDLG ShutDownDialog;    //指向shell32.dll库中显示关机对话框函数的指针
    if(hInst != NULL)
    {
    //获得函数的地址并调用之
    ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);
    (*ShutDownDialog)(0);
    }
      

  4.   

    调整当前进程权限并关机  
    http://www.xiaozhou.net/cooldog/blogview.asp?logID=33if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
            {
                MessageBox("OpenProcessToken failed!");
            }        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); //调整获得的权限
        
            if (GetLastError() != ERROR_SUCCESS) 
            {
                MessageBox("切换系统级权限失败!");
            }        fResult =InitiateSystemShutdown( 
                 NULL,                                  // 要关的计算机用户名
                 "关机时间已到,WINDOWS将在上面的时间内关机,请做好保存工作!",  // 显示的消息
                 10,                                    // 关机所需的时间
                 TRUE,                                 // ask user to close apps 
                 FALSE);                               //设为TRUE为重起,设为FALSE为关机
            if(!fResult) 
            { 
                 MessageBox("初始化系统关机失败!"); 
            }         tkp.Privileges[0].Attributes = 0; 
            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);         if (GetLastError() != ERROR_SUCCESS) 
            {
                 MessageBox("AdjustTokenPrivileges disable failed."); 
            }         ExitWindowsEx(EWX_SHUTDOWN,0);
      

  5.   

    void AutoShutdownWindows()   
    {    
        //get     os     privilege     
        HANDLE     hProcess, hToken;     
        TOKEN_PRIVILEGES     Privileges;     
        LUID     luid;     
        hProcess = GetCurrentProcess();     
            
        //Open     Process     Token     
        OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);     
        Privileges.PrivilegeCount=1;     
        LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME, &luid);     
        Privileges.Privileges[0].Luid=luid;     
        Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;     
        //Adjust     the     Privileges     
        AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL);     //shutdown   
        ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE|EWX_POWEROFF,NULL);     
    }