Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];

Вниз

Выключение компьютера   Найти похожие ветки 

 
Потерянный   (2001-12-03 11:24) [0]

Делаю так
ExitWindowsEx( EWX_FORCE ,1);
ExitWindowsEx( EWX_SHUTDOWN ,1);
Под Win9x всё нормально, а под NT просто выходит из Windows
Ну и как его выключить?


 
Dimka Maslov   (2001-12-03 13:27) [1]

function ExitWindows(uFlags: UINT): BOOL;
var
ProcessHandle: THandle;
TokenHandle: THandle;
Luid: Int64;
Tkp: TTokenPrivileges;
BufferNeeded: DWORD;
begin
if Win32Platform=VER_PLATFORM_WIN32_NT then begin
ProcessHandle:=GetCurrentProcess;
OpenProcessToken(ProcessHandle, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle);
LookupPrivilegeValue(nil, "SeShutdownPrivilege", Luid);
Tkp.PrivilegeCount:=1;
Tkp.Privileges[0].Luid:=Luid;
Tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(TokenHandle, FALSE, Tkp, 0, nil, BufferNeeded);
end;
Result:=ExitWindowsEx(uFlags, $FFFF);
end;


 
Потерянный   (2001-12-04 09:06) [2]

Спасибо.
А если под Win2000?
Пробовал не выключает компьютер ни с EWX_SHUTDAWN ни с EWX_POWEROFF


 
Searcher   (2001-12-04 22:16) [3]

2Потеряный
Код, который точно работает под Win2000. (Похоже он не сильно отличается от кода Dimka Maslov, но попробуй..)

procedure shutdown;
var
hToken:THandle;
tkp,PrevState:_TOKEN_PRIVILEGES;
k:DWORD;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);

LookupPrivilegeValue(nil, "SeShutdownPrivilege", tkp.Privileges[0].Luid);
tkp.PrivilegeCount:=1;
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(PrevState), PrevState, k);
ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN,0);

end;


 
Zyv   (2001-12-06 13:51) [4]

Маленькое добавление к коду Searcher.
В функцию ExitWindowsEx под NT/2000 лучше не вставлять флаг EWX_FORCE, т.к. такое завершение оборвет все процессы на полуслове. Можно закрыть все корректно: ExitWindowsEx(EWX_SHUTDOWN Or EWX_POWEROFF, 0).
А вот под 9X, если не вставить EWX_FORCE, то получим на экран модальное окно с сообщением, что к компьютеру подключены пользователи и т.д., после чего "программное выключение компьютера" превращается в ручное.
Исходя из изложенного, я делаю так:

function SetPrivilege(PrivilegeName: string; Enable: boolean): Boolean;
var tpPrev, Tp : TTokenPrivileges;
Token : THandle;
dwRetLen : DWord;
begin
Result := False;
If Not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, Token) Then Exit;
Tp.PrivilegeCount := 1;
If LookupPrivilegeValue(Nil, PChar(privilegeName), Tp.Privileges[0].LUID) Then
Begin
If Enable Then Tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
Else Tp.Privileges[0].Attributes := 0;
dwRetLen := 0;
Result := AdjustTokenPrivileges(Token, False, Tp, SizeOf(tpPrev), tpPrev, dwRetLen);
End;
CloseHandle(Token);
end;

// вызывающая процедура
begin
...
If Win32Platform = VER_PLATFORM_WIN32_WINDOWS Then
Begin
ExitWindowsEx(EWX_FORCE Or EWX_SHUTDOWN Or EWX_POWEROFF, 0);
End;
If Win32Platform = VER_PLATFORM_WIN32_NT Then
Begin
SetPrivilege("SeShutdownPrivilege", True);
ExitWindowsEx(EWX_SHUTDOWN Or EWX_POWEROFF, 0);
End;
...
end;


 
Zyv   (2001-12-06 13:59) [5]

Кстати, сам хочу спросить мастеров: вышеприведенный пример работает прекрасно на 9X/Me/2000, но как можно снять питание под NT???
Без флага EWX_POWEROFF выключение заканчивается на сообщении: "Теперь можно выключить питание компьютера", а с этим флагом питание вроде бы снимается, все гаснет, но через секунду - перезагрузка.
Вообще, можно ли научить NT понимать ATX-ное питание?


 
Wizard_Ex   (2001-12-06 19:39) [6]

Есть какая то заплатка, вроде
А так NT ATX не знает что ето, она уже седая(но рульная до сих)


 
Потерянный   (2001-12-11 09:50) [7]

Мои благодарности всем откликнувшимся.
(Под ХР тоже работает)


 
Zyv   (2001-12-11 11:09) [8]

И под NT тоже. Заплатку, о которой говорил Wizard_Ex, я совершенно неожиданно нашел в ServicePack 4 и выше. Если SP распаковать, то там найдется файл hal.dll.softex. Его нужно положить вместо штатного hal.dll в NT и прописать ключ реестра
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"PowerdownAfterShutdown"="1"

После этого "рульная до сих" NT тоже выключается.
Удачи всем.



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.004 c
14-43163
BlackRainbow
2002-01-31 11:27
2002.03.14
Help file for LMDTools


6-43128
SemFLY
2001-12-26 22:02
2002.03.14
Как вытащить символ из посланного сообщения ? TServerSocket - TClientCosket


14-43146
Merlin
2002-01-25 04:31
2002.03.14
Вышла новая версия чисто русского DELPHI !!!!


3-42941
Hawk2
2002-02-15 09:51
2002.03.14
Вопрос о двух DBGrid-ах.


14-43182
Blackweber
2002-01-31 21:21
2002.03.14
Помогите с DVD!!!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский