Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизПочему Windows всё-таки не завершает работу Найти похожие ветки
← →
VID (2003-11-02 14:22) [0]Почему процедура Procedure ShutDownWindows не завершает корректно работу windows 2000, а лишь приводит к появлению на экране сообщения, что "теперь питание компа можно выключить" ?
Причём при стандартном, "ручном" завершении работы виндовз это сообщение не появляется, и комп нормально выключается. Также и программа FlashGet которая предусматривает возможность автоматического завершения работы ОС, при завершении закачки, тоже умеет нормально выключать комп.
Что за проблема тогда с процедурой ShutDownWindows ?
function GetWinVersion: String;
var VersionInfo : TOSVersionInfo;
OSName : String;
begin
VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
if Windows.GetVersionEx( VersionInfo ) then
begin
with VersionInfo do
begin
case dwPlatformId of
VER_PLATFORM_WIN32s : OSName := "Win32s";
VER_PLATFORM_WIN32_WINDOWS : OSName := "Windows 95";
VER_PLATFORM_WIN32_NT : OSName := "Windows NT";
end;
Result := OSName + " Version " + IntToStr( dwMajorVersion ) + "." + IntToStr( dwMinorVersion ) +
#13#10" (Build " + IntToStr( dwBuildNumber ) + ": " + szCSDVersion + ")";
end;
end
else Result := "";
end;
Procedure ShutDownWindows;
//Завершение работы Windows {Эту функцию лучше вызывать по таймеру через каждую секунду}
const SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
var hToken : THandle;
tkp : TTokenPrivileges;
tkpo : TTokenPrivileges;
zero : DWORD;
begin
if Pos( "Windows NT", GetWinVersion) = 1 then
begin
zero := 0;
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, "Exit Error", "OpenProcessToken() Failed", MB_OK );
Exit;
end;
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, "Exit Error", "OpenProcessToken() Failed", MB_OK );
Exit;
end;
if not LookupPrivilegeValue( nil, "SeShutdownPrivilege" , tkp.Privileges[ 0 ].Luid ) then
begin
MessageBox( 0, "Exit Error", "LookupPrivilegeValue() Failed", MB_OK );
Exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );
if Boolean( GetLastError() ) then
begin
MessageBox( 0, "Exit Error", "AdjustTokenPrivileges() Failed", MB_OK );
Exit;
end else ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
end else ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
end;
← →
Anatoly Podgoretsky (2003-11-02 14:28) [1]А где у тебя EWX_POWEROFF?
Смотри статью http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N162
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.931 c