Завершение работы Windows
Приводим обе функции для перезапуска операционной системы:
Функция ExitWindows не была правильно задокументирована Microsoft'ом и не содержит описания возвращаемого значения. Более того, информация о этой функции практически не встречается в других источниках. Вот правильное определение этой функции:
Улучшения
Хотелось бы внести некоторые дополнения с Ваш FAQ, которые касаются вопроса о завершении/перезагрузки Windows. Указанный код не даст результата для Windows NT (и даже, наверное, для Win2000). Ниже - корректно работающий код для Win9x и WinNT. Проверено под D4.
uses Windows;
procedure RebootSystem;
var
Тем не менее есть 16-битная функция ExitWindows, которая позволяет выполнить перезапуск, будучи вызванной с параметром EW_RESTARTWINDOWS.
Соответственно, в 32-битном приложении Вам либо нужно использовать Thunks, либо запускать дочернее 16-битное приложение, вызывающее данную функцию.
Даже если ты работаешь под Администратором, твоя программка должна запросить дополнительные привилегии. Вот как это делается (на языке Си):
void Reboot (void)Здесь иная редакция этой процедуры (на Паскале, без проверки версии ОС) -
{
HANDLE hToken;
TOKEN_PRIVILEGES* NewState;
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx (&OSVersionInfo);
if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES,
&hToken);
NewState = (TOKEN_PRIVILEGES*) malloc (sizeof
(TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES));
NewState->PrivilegeCount = 1;
LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME,
&NewState->Privileges[0].Luid);
NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges (hToken, FALSE, NewState, NULL, NULL, NULL);
free (NewState);
CloseHandle (hToken);
}
ExitWindowsEx (EWX_REBOOT, 0);
}
Procedure Shutdown(Name:String; // Имя машины (\\SERVER)