日期:2014-05-17  浏览次数:20831 次

重要紧急:一段关机重启的代码ShutDownMachine的执行结果不令人满意,请各位指教,来者有份,谢谢!!!
经过添加调试后的代码如下:
BOOL   ShutDownMachine()
{
DebugLogFile( "Begin   to   ShutDownMachine! ");
TOKEN_PRIVILEGES   tp;
LUID   luid;
HANDLE   hTokenHandle   ;
HANDLE   hProcess   =   NULL;
BOOL   bSuccess;
DWORD   dwLastError;

//get   Token
hProcess   =   GetCurrentProcess();
bSuccess   =   OpenProcessToken(hProcess,   TOKEN_ADJUST_PRIVILEGES   |   TOKEN_QUERY,     &hTokenHandle);
if   (!bSuccess)
{
DebugLogFile( "OpenProcessToken,bSuccess   ==   FALSE. ");
dwLastError   =   GetLastError();
return   FALSE;
}

DebugLogFile( "Get   Token   success! ");
//get   shut   down   luid
bSuccess   =   LookupPrivilegeValue(NULL,   SE_SHUTDOWN_NAME,   &luid);
if   (!bSuccess)
{
DebugLogFile( "LookupPrivilegeValue,bSuccess   ==   FALSE. ");
dwLastError   =   GetLastError();
return   FALSE;
}

DebugLogFile( "Get   shut   down   priviledge   success! ");
tp.PrivilegeCount   =   1;
tp.Privileges[0].Luid   =   luid;
tp.Privileges[0].Attributes   =   SE_PRIVILEGE_ENABLED;

//get   shut   down   priviledge
bSuccess   =   AdjustTokenPrivileges(hTokenHandle,   FALSE,   &tp,  
  sizeof(TOKEN_PRIVILEGES),   NULL,   NULL);
if   (!bSuccess)
{
DebugLogFile( "AdjustTokenPrivileges,bSuccess   ==   FALSE. ");
dwLastError   =   GetLastError();
return   FALSE;
}

DebugLogFile( "AdjustTokenPrivilege   succeed! ");

//restart   this   computer
if   (!ExitWindowsEx(   EWX_REBOOT|EWX_FORCE,   0))
{
DebugLogFile( "ExitWindowsEx   return   fail. ");
dwLastError   =   GetLastError();
return   FALSE;
}

DebugLogFile( "restart   this   computer   succeed! ");
return   TRUE;
}
上面的代码执行后,其实是尝试重启电脑的。但是一直不能成功,直到一段时间以后(这段时间并不固定,具体数据参下),才能完成电脑重启。下面的是用户使用中的统计结果(英文版WinXpSP1):
最长的一次从
2007-1-10   5:8:10   g_iTimeOut   =   16.
2007-1-10   8:3:33   LookupPrivilegeValue,bSuccess   ==   FALSE.
2007-1-10   8:4:35   LookupPrivilegeValue,bSuccess   ==   FALSE.
历时将近3个小时。
电脑于8:06:07重启

2007-1-10   8:51:32   g_iTimeOut   =   16.
2007-1-10   8:51:41   LookupPrivilegeValue,bSuccess   ==   FALSE.
历时不到10秒。
电脑于8:52:32重启

最短的一次从
2007-1-10   16:8:6   g_iTimeOut   =   16.
2007-1-10   16:8:14   LookupPrivilegeValue,bSuccess   ==   FALSE.
历时仅仅8秒。
电脑于16:09:26重启

2007-1-10   20:7:3   g_iTimeOut   =   16.
2007-1-10   20:7:13   LookupPrivilegeValue,bSuccess   ==   FALSE.
历时10分钟。
电脑于20:08:09重启

而根据我电脑(中文WinXpSp2)的测试结果如下:
第一次:50秒
2007-1-13   14:34:53   g_iTimeOut   =   16.
2007-1-13   14:35:42   LookupPrivilegeValue,bSuccess   ==   FALSE.
第二次:11秒
2007-1-13   21:14:23   g_iTimeOut   =   16.
2007-1-13   21:14:34