操作系统为 xp我用ExitWindowsEx(EWX_FORCE|EWX_SHUTDOWN);ExitWindowsEx(EWX_POWEROFF,0):
但是不行。还是和注销差不多。不能连机箱电源也关了。再用WinExec("rundll32.exe shell32.dll,SHExitWindowsEx 1",SW_NORMAL);还是不行。调试后说shell32.dll出错 失去条目SHExitWindowsEx
但是不行。还是和注销差不多。不能连机箱电源也关了。再用WinExec("rundll32.exe shell32.dll,SHExitWindowsEx 1",SW_NORMAL);还是不行。调试后说shell32.dll出错 失去条目SHExitWindowsEx
BOOL CCloseDlg::CloseComputer(UINT uFlag)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))return FALSE;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tp.Privileges[0].Luid);
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tp,0,(PTOKEN_PRIVILEGES)NULL,0);
if(GetLastError()!=ERROR_SUCCESS)return FALSE;
return ExitWindowsEx(uFlag,NULL);
}void CCloseDlg::OnButtonClose()
{
// TODO: Add your control notification handler code here
if(CloseComputer(EWX_POWEROFF|EWX_FORCE))OnOK();
}void CCloseDlg::OnButtonReboot()
{
// TODO: Add your control notification handler code here
if(CloseComputer(EWX_REBOOT|EWX_FORCE))OnOK();
}
{
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);
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
return FALSE; return TRUE;
}