안녕하세요.. 델파이를 사랑하는 여러분..
다름이 아니라 윈도우즈를 종료하고 재시작하는데 있어서 좀 의하한게 있어서
이렇게 글을 올립니다.
분명히 도움말에는 된다고 하는데 제가 뭘 잘못했나요..?
제가쓴 함수는 ExitWindowsEx(EWX_FORCE or EWX_REBOOT, 0); 입니다.
그런데 95,98에서는 되는데 NT에서는 되질 않는군요..
이문제를 아시는 분은 제발 도와주세요..^^
Microsoft가 왠지 밉군요..^^이럴땐....
그럼, 즐거운 하루가 되세요..
> 안녕하세요.. 델파이를 사랑하는 여러분..
>
> 다름이 아니라 윈도우즈를 종료하고 재시작하는데 있어서 좀 의하한게 있어서
> 이렇게 글을 올립니다.
>
> 분명히 도움말에는 된다고 하는데 제가 뭘 잘못했나요..?
>
> 제가쓴 함수는 ExitWindowsEx(EWX_FORCE or EWX_REBOOT, 0); 입니다.
>
> 그런데 95,98에서는 되는데 NT에서는 되질 않는군요..
>
> 이문제를 아시는 분은 제발 도와주세요..^^
> Microsoft가 왠지 밉군요..^^이럴땐....
>
> 그럼, 즐거운 하루가 되세요..
>
안녕하세요~ 구창민입니다.
이미 오래전에 뉴스그룹에 소개되었던 내용이죠. ^^;
NT는 일반적인 ExitWindowsEX 함수가 서포트를 하지 안습니다.
대신 AdjustTokenPrivileges를 이용하시면 가능합니다.
제가 일전에 테스트 했을때 완벽히 동작했습니다.
그럼~ 즐거운 프로그래밍 하시길~
var
PreviosPrivileges : ^TTokenPrivileges;
TokenPrivileges : TTokenPrivileges;
ProcessHandle : THandle;
tmp : Integer;
begin
if not OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,ProcessHandle ) then
Exit;
LookupPrivilegeValue( '', 'SeShutdownPrivilege', TokenPrivileges.Privileges[0].Luid );
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tmp := 0;
PreviosPrivileges := nil;
AdjustTokenPrivileges(ProcessHandle, False, TokenPrivileges, 0, PreviosPrivileges^, tmp);
if not GetLastError()=ERROR_SUCCESS then
Exit;
if not InitiateSystemShutdown( '', '', 0, True, True ) then
Exit;
TokenPrivileges.Privileges[0].Attributes := 0;
AdjustTokenPrivileges( ProcessHandle, False, TokenPrivileges, 0,PreviosPrivileges^, tmp );
end;