64비트에서 환경인가요?
일단 shutdown 방식이 잘못되었습니다.
TOKEN_PRIVILEGES 으로 권한 과 API를 이용하여 진행 해보세요
아래는 MSDN 코드입니다.
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
BOOL Result;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return;
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)
return;
Result = InitiateSystemShutdown(
NULL,
L"System rebooting.",
0, // TIMEOUT
FALSE,
TRUE);
if (!Result)
return;
tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
푸릉푸릉 님이 쓰신 글 :
:
:
: 안녕하세요..
:
: windows7 에서 WM_QUERYENDSESSION 이벤트 발생 했을 때 시스템 종료를 막고, shutdown.exe 이용하여 재부팅을 하게 하고 있는데요
: shutdown.exe 실행할 때 "응용 프로그램을 제대로 시작하지 못했습니다" 에러가 발생합니다..
:
: XP 같은 경우는 WM_QUERYENDSESSION 이벤트에서 시스템 종료 막고, PostMessage 이용하여 shutdown.exe 실행하면 정상 동작하고
: windows 8 이상 OS 에서는 WM_QUERYENDSESSION 이벤트에서 바로 shutdown.exe 실행하면 정상동작하는데..
:
: windows 7 에서는 종료는 잘 막히는데 shutdown.exe 실행이 안됩니다.
:
: '컴퓨터 종료' 하면 무조건 저기서 hold 시키고 작업을 진행해야 하는 것으로 알고 있는데..
: 저 이벤트에서 hold 시키면 빠져나오는 것도 아니고 계속 hold 되어 있고..
: 그 상태에서 프로세스 실행하려 하니 이미 종료 단계에 들어가 있어서 실행 안되는 것 같고..
:
:
: 혹시 해결할 수 있는 방법이 있을까요?
: 아래는 현재 테스트 중인 코드입니다..
:
:
: --------------------------------------------
: void __fastcall TForm1::WMQueryEndSession(TMessage &Msg)
: {
: if( Msg.LParam != ENDSESSION_CRITICAL )
: {
: if( m_bReboot == false )
: {
: //xp
: //{
: // m_bReboot = true;
: //
: // Msg.Result= LRESULT(false); //prevent shutdown..
: //
: // PostMessage( this->Handle, WM_TEST_ADD, NULL, NULL );
: //}
:
: //win7
: //{
: m_bReboot = true;
:
: Msg.Result= LRESULT(false); //prevent shutdown..
:
: ShutdownBlockReasonCreate( this->Handle, L"please wait while muting... (test)");
:
: WinExec( "C:\\Windows\\System32\\shutdown.exe /r /t 1", true );
:
: //PostMessage( this->Handle, WM_TEST_ADD, NULL, NULL );
:
: WaitFor( 10000 );
:
: ShutdownBlockReasonDestroy( this->Handle );
:
: //}
: return;
: }
: }
:
: Msg.Result = LRESULT(true);
:
: }
: --------------------------------------------
:
:
:
:
: