我想获取exitwindowsex的函数地址,大家看看我的做法
typedef BOOL (WINAPI *pEXITWINDOWSEX)(UINT,DWORD);pEXITWINDOWSEX ppp=(pEXITWINDOWSEX)::GetProcAddress(GetModuleHandle("user32.dll"),"ExitWindowsEx");ppp(EWX_SHUTDOWN|EWX_FORCE,0);
结果怎么不能关机呢,无反应呢

解决方案 »

  1.   


    typedef   enum   _SHUTDOWN_ACTION{   
        ShutdownNoReboot,   
        ShutdownReboot,   
        ShutdownPowerOff   
    }   SHUTDOWN_ACTION,   *PSHUTDOWN_ACTION;   typedef NTSYSAPI LONG (NTAPI *fnNtShutdownSystem)(SHUTDOWN_ACTION);
    void CShutDownDlg::OnBnClickedOk()
    {
        // TODO: 在此添加控件通知处理程序代码
    HMODULE hModule = LoadLibrary("ntdll.dll");
        if (hModule)
        {
            fnNtShutdownSystem fn = (fnNtShutdownSystem)GetProcAddress(hModule, "NtShutdownSystem");
            if (fn)
            {
                fn(ShutdownPowerOff);
            }
            else
            {
                MessageBox("程序出错了!","警告",MB_OK|MB_ICONSTOP);
            }    }
    }
    试试这个
      

  2.   

    ExitWindowsEx不能关机估计是权限不够,提权下
        HANDLE hToken; 
        TOKEN_PRIVILEGES tkp;     // Get a token for this process.     if (!OpenProcessToken(GetCurrentProcess(), 
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
            return( FALSE );     // Get the LUID for the shutdown privilege.     LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
            &tkp.Privileges[0].Luid);     tkp.PrivilegeCount = 1;  // one privilege to set    
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;     // Get the shutdown privilege for this process.     AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
            (PTOKEN_PRIVILEGES)NULL, 0); 
      

  3.   

    lz 应该添加操作成功与否的判断语句在加调试的话基本的问题都能解决直接加载 windows api 函数应该先用工具或查查文档,看函数所在的 DLL
      

  4.   

    typedef BOOL (WINAPI *pEXITWINDOWSEX)(UINT,DWORD); 
    换成
    typedef BOOL (*pEXITWINDOWSEX)(UINT, DWORD);应该没有WINAPI
      

  5.   

    PROC pEXITWINDOWSEX=GetProcAddress(GetModuleHandleA("USER32"),"ExitWindowsEx"); 
      

  6.   

    ExitWindowsEx可以直接调用的,还非得从USER32里面取,根本就是多此一举