我的程序中用到ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF,0)在98下可以关掉计算机,但到WIN2000下运行却没有反应,
这是什么原因?
如果想关掉机器,有没有别的API?
是不是我的参数写错了?谢谢您!

解决方案 »

  1.   

    这是关机的代码:
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;
    BOOL fResult;
       
       //打开与当前进程相关联的存取标识
     if (!::OpenProcessToken(GetCurrentProce(),TOKEN_ADJUST_PRIVILEGES
         |TOKEN_QUERY,&hToken))
     AfxMessageBox("OpenProcessToken failed");
       //查出本机系统的当前特权的Luid
    ::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privilege[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)
    AfxMessageBox("AdjustTokenPrivileges enable failed");
    fResult = ::InitiateSystemShutdown(NULL,"即将关机",20,FALSE,
                 TRUE);
    if (!fResult)
       AfxMessageBox("InitiateSystemShutDown failed");
    tkp.Privileges[0].Attributes = 0;
    ::AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)   NULL,0);
    if (::GetLastError()!=ERROR_SUCCESS)
          AfxMessageBox("AdjustTokenPrivileges disable failed");
      

  2.   

    代码那么长,在这里没法贴啊
    你知道关机的API吗
      

  3.   

    为什么在98下这个API可以,
    在2000下却不起作用
    请大家拉我一把
    谢谢
      

  4.   

    2000与98不一样,程序如下:
    void WINAPI ExitWin() 

        DWORD dwVer; 
        HANDLE hProcess, hToken; 
        TOKEN_PRIVILEGES NewState; 
        DWORD ProcessId, ReturnLength = 0; 
        LUID luidPrivilegeLUID;     dwVer=GetOS(); 
        if(dwVer==VER_PLATFORM_WIN32_WINDOWS) 
            ExitWindowsEx(1,0);     else if(dwVer==VER_PLATFORM_WIN32_NT) 
        { 
            ProcessId = GetCurrentProcessId(); 
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId); 
            OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES, &hToken); 
            LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luidPrivilegeLUID);         NewState.PrivilegeCount = 1; 
            NewState.Privileges[0].Luid = luidPrivilegeLUID; 
            NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;         if(AdjustTokenPrivileges(hToken, FALSE, &NewState, NULL, NULL, NULL)) 
                ExitWindowsEx(EWX_FORCE|EWX_POWEROFF,0); 
        } 
    } DWORD WINAPI GetOS() 

        OSVERSIONINFO os; 
        TCHAR sVersion[MAX_PATH];     os.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); 
        GetVersionEx(&os); 
        switch(os.dwPlatformId) 
        { 
        case VER_PLATFORM_WIN32_WINDOWS: 
            return VER_PLATFORM_WIN32_WINDOWS;     case VER_PLATFORM_WIN32_NT: 
            return VER_PLATFORM_WIN32_NT; 
        } 
    }
      

  5.   

    谢谢!
    是不是没有在98下和2000下都能用的关机API?
    麻烦了!