Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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 тоже выключается.
Удачи всем.




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




Наверх





Память: 0.73 MB
Время: 0.045 c
3-42923           tovSuhov              2002-01-30 12:07  2002.03.14  
ADOQuery...


14-43137          Helen                 2002-01-29 15:32  2002.03.14  
SQL запрос SQL запроса компонента ADOQuery! (D5, MSSQL)


3-42939           Саша                  2002-02-06 11:47  2002.03.14  
Как записать значение в BLOB поле


3-42982           Люк                   2002-02-15 11:45  2002.03.14  
Работа ADO под WindowsXP


14-43136          Polevi                2002-01-28 16:29  2002.03.14  
IIS не поддерживает сервлеты :( Свинство просто..