关闭系统的函数为:
BOOL ExitWindowsEx(
  UINT uFlags,       // shutdown operation
  DWORD dwReserved   // reserved
);
该函数在User32.dll中,查一查MSDN的帮助可以知道关于该函数以及参数更详细的说明。

解决方案 »

  1.   

    windows下是调用API函数:ExitWindows或ExitWindowsEx原型:BOOL ExitWindows(
      DWORD dwReserved,  // reserved; must be zero
      UINT uReserved     // reserved; must be zero
    );
    BOOL ExitWindowsEx(
      UINT uFlags,       // shutdown operation
      DWORD dwReserved   // reserved
    );
    在MSDN上有详细的说明
      

  2.   

    没的说了。在WI\nNT下注意权限问题。
      

  3.   

    估计是在 WINNT 或 WIN2000 下权限不够的问题,请在执行 ExitWindowsEx 前执行以下函数
    void CMyDlg::SetPriviles()
    {
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;
        if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
            MessageBox("OpenProcessToken Error !","Error");
        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("AdjustTokenPrivileges Error !","Error");
        return;
      

  4.   


    如果在Win98/95下雪儿说的就足够了,如果在NT或2000下,还有一些工作要做。
      

  5.   

    同意prog_st(st):我也给一段代码,我在今年7月专门研究过这个问题:
    ////设置权限
    BOOL CExitWindowsDlg::SetPrivilige(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)
    {
    TOKEN_PRIVILEGES tp;
    LUID luid; if (!LookupPrivilegeValue(NULL,lpszPrivilege,&luid))
    {
    printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
    return FALSE; 
    } tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
    tp.Privileges[0].Attributes = 0; AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES) NULL,(PDWORD) NULL); if (GetLastError() != ERROR_SUCCESS)

    printf("AdjustTokenPrivileges failed: %u\n", GetLastError() ); 
    return FALSE; 
    }  return TRUE;
    }///// 一个退出windows button的click
    void CExitWindowsDlg::OnExitWindows() 
    {
    HANDLE hToken,hPHandle;
    LPCTSTR lpszPrivilege;
    BOOL bEnablePrivilege;
    DWORD dwVersion,dwWindowsMajorVersion,dwWindowsMinorVersion;
    CString str; dwVersion=GetVersion(); dwWindowsMajorVersion=(DWORD)(LOBYTE(LOWORD(dwVersion)));
    dwWindowsMinorVersion=(DWORD)(HIBYTE(LOWORD(dwVersion))); if (dwVersion < 0x80000000)                // Windows NT
    {
    hPHandle=GetCurrentProcess();
    if(OpenProcessToken(hPHandle,TOKEN_ADJUST_PRIVILEGES/*TOKEN_ALL_ACCESS*/,&hToken)==FALSE)
    {
    // DWORD ErrorID;char temp[128];
    // ZeroMemory(temp,128);
    // ErrorID=GetLastError();
    // sprintf(temp,"%d",ErrorID);
    // str=temp;
    str.Format("%d",GetLastError());
    MessageBox("Openprocesstoken ERROR_ID:"+str,NULL,MB_OK);
    }
    lpszPrivilege=SE_SHUTDOWN_NAME;
    bEnablePrivilege=TRUE;
    SetPrivilige(hToken,lpszPrivilege,bEnablePrivilege);
    } ExitWindowsEx(shutdown_type,NULL);
    }