Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.14;
Скачать: CL | DM;

Вниз

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

 
Потерянный ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
4-43213
_SnAke_
2002-01-15 12:31
2002.03.14
TRegIniFile (реестр Windows)


7-43192
Schummi
2001-12-09 08:34
2002.03.14
Iexplore


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


3-42924
lel (A)
2002-02-13 10:24
2002.03.14
Oracle, Delphi 3, BDE 4,5 редактор полей , а может что нибудь еще???


3-42967
Dad
2002-02-09 13:58
2002.03.14
Как отсортировать поле по убыванию