Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 10.3 Функция ExitWindows работает некорректно / 25 сообщений из 50, страница 1 из 2
17.07.2020, 00:09
    #39980692
Delphi 10.3 Функция ExitWindows работает некорректно
Всем привет!

В приложении необходимо использовать завершение работы, перезагрузку и выход до смены пользователя, с помощью WinAPI. Использую функции:

Код: pascal
1.
2.
3.
ExitWindows(EWX_SHUTDOWN,0);
ExitWindows(EWX_REBOOT,0);
ExitWindows(EWX_LOGOFF,0);



Но во всех трех случаях происходит закрытие всех программ и выход на окно авторизации. Грубо говоря, в трех разных вариациях срабатывает (судя по симптомам) - ExitWindows(EWX_LOGOFF,0);

Подскажите, что делаю не так? Или быть может есть альтернативы?
...
Рейтинг: 0 / 0
17.07.2020, 00:26
    #39980695
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Евгений Стронгчто делаю не так?

Гуглишь готовый код прошлого века вместо чтения документации
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-exitwindows
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.07.2020, 01:16
    #39980718
Delphi 10.3 Функция ExitWindows работает некорректно
Dimitry Sibiryakov

Евгений Стронгчто делаю не так?

Гуглишь готовый код прошлого века вместо чтения документации
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-exitwindows


Не понятно только, чем мне из нашего века может помочь ссылка? Рекомендуют запустить так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void ExitWindows(
   dwReserved,
   Code
);
Parameters
dwReserved

This parameter must be zero.

Code

This parameter must be zero. 



Получается у меня такой код:

Код: pascal
1.
ExitWindows(0, 0);



И снова не происходит выключение компьютера.

Вот эта ссылка куда полезнее по функциям:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-exitwindowsex

Но не понятен вот такой момент. Что подставлять в Code

Код: c#
1.
2.
3.
4.
void ExitWindows(
   dwReserved,
   Code
);



Допустим для функции лог офф она будет выглядеть вот так:

Код: c#
1.
2.
3.
4.
BOOL ExitWindowsEx(
  EWX_LOGOFF,
  0
);




Но а как мне выполнить ребут, например - EWX_REBOOT. Подставляя параметр 0 - ничего не происходит.
...
Рейтинг: 0 / 0
17.07.2020, 01:21
    #39980720
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
MSDN ExitWindows
Calls the ExitWindowsEx function to log off the interactive user.

MSDN ExitWindowsEx
Logs off the interactive user, shuts down the system, or shuts down and restarts the system.

Так виднее?
...
Рейтинг: 0 / 0
17.07.2020, 01:26
    #39980723
Delphi 10.3 Функция ExitWindows работает некорректно
GunSmoker
MSDN ExitWindows
Calls the ExitWindowsEx function to log off the interactive user.


MSDN ExitWindowsEx
Logs off the interactive user, shuts down the system, or shuts down and restarts the system.

Так виднее?

А что я тут должен увидеть? У меня вопрос в передачи параметров для функции, а не в их названиях. Я уже перепробовал и ExitWindows и ExitWindowsEx.
...
Рейтинг: 0 / 0
17.07.2020, 01:53
    #39980724
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
...
Рейтинг: 0 / 0
17.07.2020, 01:55
    #39980726
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Совсем слепой?

MSDNCalls the ExitWindowsEx function to log off the interactive user.
(выделение моё)

Всё. Ничего больше она делать не умеет.

MSDNParameters
dwReserved
This parameter must be zero.

Code
This parameter must be zero.

Ну и куда ты параметры-то суёшь?
...
Рейтинг: 0 / 0
17.07.2020, 02:49
    #39980730
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
GunSmoker, а может, если ему выделить на той страничке "Applications should call ExitWindowsEx directly." он додумается открыть хелп по нужной функции? ))
...
Рейтинг: 0 / 0
17.07.2020, 03:29
    #39980731
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Он походу вообще читать не умеет
To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information, see Running with Special Privileges.
...
Рейтинг: 0 / 0
17.07.2020, 09:29
    #39980766
Delphi 10.3 Функция ExitWindows работает некорректно
X-Cite
Он походу вообще читать не умеет
To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information, see Running with Special Privileges.


Да я погляжу вы тут умные все собрались, что никто не может код скинуть рабочий. Ты сам-то читать умеешь? Открой хелп и почитай.

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-exitwindowsex

Посмотри, сколько флагов имеет эта функция. Не форум, а дерьмо какое-то. Вместо помощи только и брызжет каждый негативом. Я в самом начале задал конкретный и четкий вопрос про три функции, которые мне необходим. Выключение, рестарт и логофф. И это раньше прекрасно работало вот в таком виде:

Код: pascal
1.
2.
3.
ExitWindows(EWX_SHUTDOWN,0);
ExitWindows(EWX_REBOOT,0);
ExitWindows(EWX_LOGOFF,0);



Из них работает только ExitWindows(EWX_LOGOFF,0);

Вот я и спросил про остальные две. Не знаете, так и нечего кидать меня по хелпам, которые я и так прочитал ещё до написания поста и я об этом написал. Идет описание различных параметров для функций. Читать-то умеете умники? Ссылка чуть выше.
...
Рейтинг: 0 / 0
17.07.2020, 09:33
    #39980768
Delphi 10.3 Функция ExitWindows работает некорректно
white_nigger
GunSmoker, а может, если ему выделить на той страничке "Applications should call ExitWindowsEx directly." он додумается открыть хелп по нужной функции? ))


А ты додумаешься почитать мой второй пост и увидеть, что я эту функцию уже использовал и прекрасно знаю о ней. Они имеет несколько флагов и они НЕ работают, как мне надо. Или кроме как брызгание комментами бесполезными и не умеешь ничего? Или вы так сообщения себе набиваете для статистики? Так они бесполезны.
...
Рейтинг: 0 / 0
17.07.2020, 10:21
    #39980803
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Чего бычить, если сам лажаешь.
Евгений Стронг

Допустим для функции лог офф она будет выглядеть вот так:

Код: c#
1.
2.
3.
4.
BOOL ExitWindowsEx(
  EWX_LOGOFF,
  0
);


Но а как мне выполнить ребут, например - EWX_REBOOT. Подставляя параметр 0 - ничего не происходит.

Так и подставляй EWX_REBOOT, при чем тут 0 (который = EWX_LOGOFF)
...
Рейтинг: 0 / 0
17.07.2020, 11:07
    #39980823
Delphi 10.3 Функция ExitWindows работает некорректно
Fr0sT-Brutal
Чего бычить, если сам лажаешь.
Евгений Стронг

Допустим для функции лог офф она будет выглядеть вот так:

Код: c#
1.
2.
3.
4.
BOOL ExitWindowsEx(
  EWX_LOGOFF,
  0
);


Но а как мне выполнить ребут, например - EWX_REBOOT. Подставляя параметр 0 - ничего не происходит.

Так и подставляй EWX_REBOOT, при чем тут 0 (который = EWX_LOGOFF)


Функция ExitWindowsEx подразумевает ДВА параметра. Я это и пытаюсь выяснить уже на протяжении какого сообщения. 0 - параметр для логоффа, а какой для EWX_REBOOT? Что подставить вместо 0? Так понятнее?
...
Рейтинг: 0 / 0
17.07.2020, 11:09
    #39980825
d7i
d7i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Код: plaintext
1.
2.
3.
4.
5.
6.
#define EWX_LOGOFF   0
#define EWX_SHUTDOWN 1
#define EWX_REBOOT   2
#define EWX_FORCE    4
#define EWX_POWEROFF 8
#define ExitWindows(dwReserved, Code) ExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)
...
Рейтинг: 0 / 0
17.07.2020, 11:12
    #39980828
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Евгений Стронг
Функция ExitWindowsEx подразумевает ДВА параметра. Я это и пытаюсь выяснить уже на протяжении какого сообщения. 0 - параметр для логоффа, а какой для EWX_REBOOT? Что подставить вместо 0? Так понятнее?

Зачем пытаться выяснить, ты не можешь по ссылке в MSDN, которую сам же привел, описание прочитать?
...
Рейтинг: 0 / 0
17.07.2020, 11:24
    #39980834
Delphi 10.3 Функция ExitWindows работает некорректно
d7i
Код: plaintext
1.
2.
3.
4.
5.
6.
#define EWX_LOGOFF   0
#define EWX_SHUTDOWN 1
#define EWX_REBOOT   2
#define EWX_FORCE    4
#define EWX_POWEROFF 8
#define ExitWindows(dwReserved, Code) ExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)



Спасибо. Но не работает. То есть во всех трех случаях происходит закрытие всех приложение и выход до окна авторизации. То есть по сути логофф во всех случаях.

Код: pascal
1.
2.
3.
ExitWindows(EWX_SHUTDOWN,1);
ExitWindows(EWX_REBOOT,2);
ExitWindows(EWX_LOGOFF,0);



Буду дальше разбираться. Быть может проблема на уровне привилегий или ещё чего там мелкософт поменял в API.
...
Рейтинг: 0 / 0
17.07.2020, 11:28
    #39980836
d7i
d7i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Евгений Стронг,
Обратите внимание на
Код: plaintext
1.
#define ExitWindows(dwReserved, Code) ExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)


По-моему надо вызывать
Код: plaintext
1.
 ExitWindowsEx(2,0)
...
Рейтинг: 0 / 0
17.07.2020, 11:39
    #39980842
Delphi 10.3 Функция ExitWindows работает некорректно
d7i
Евгений Стронг,
Обратите внимание на
Код: plaintext
1.
#define ExitWindows(dwReserved, Code) ExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)


По-моему надо вызывать
Код: plaintext
1.
 ExitWindowsEx(2,0)



Попробовал так, но ничего не происходит вообще.
...
Рейтинг: 0 / 0
17.07.2020, 11:54
    #39980850
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Первая ссылка в гугле https://forum.sources.ru/index.php?showtopic=6362
...
Рейтинг: 0 / 0
17.07.2020, 12:15
    #39980861
Delphi 10.3 Функция ExitWindows работает некорректно
wadman
Первая ссылка в гугле https://forum.sources.ru/index.php?showtopic=6362


Совершенно верно и в моем сообщении я использовал именно этот код:

ExitWindows(EWX_LOGOFF,0); - завершение сеанса
ExitWindows(EWX_SHUTDOWN,0); - выключение компьютера
ExitWindows(EWX_REBOOT,0); - перезагрузка

И потому, что он НЕ работает - я обратился на форум за помощью.
...
Рейтинг: 0 / 0
17.07.2020, 12:19
    #39980864
iStrannik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Использовал такой код:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
unit ExitRebootWindows_Unit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, ShellApi, Vcl.Forms, ActiveX, IOUtils;


function MyExitWindows(RebootParam: Longword): Boolean;
procedure SleepPC; {Отправить в сон}
procedure ShellExecute(const AWnd: HWND; const AOperation, AFileName: String; const AParameters: String = ''; const ADirectory: String = ''; const AShowCmd: Integer = SW_SHOWNORMAL);

implementation

procedure ShellExecute(const AWnd: HWND; const AOperation, AFileName: String; const AParameters: String = ''; const ADirectory: String = ''; const AShowCmd: Integer = SW_SHOWNORMAL);
var
  ExecInfo: TShellExecuteInfo;
  NeedUninitialize: Boolean;
begin
  Assert(AFileName <> '');

  NeedUninitialize := SUCCEEDED(CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE));
  try
    FillChar(ExecInfo, SizeOf(ExecInfo), 0);
    ExecInfo.cbSize := SizeOf(ExecInfo);

    ExecInfo.Wnd := AWnd;
    ExecInfo.lpVerb := Pointer(AOperation);
    ExecInfo.lpFile := PChar(AFileName);
    ExecInfo.lpParameters := Pointer(AParameters);
    ExecInfo.lpDirectory := Pointer(ADirectory);
    ExecInfo.nShow := AShowCmd;
    ExecInfo.fMask := SEE_MASK_NOASYNC { = SEE_MASK_FLAG_DDEWAIT для старых версий Delphi }
                   or SEE_MASK_FLAG_NO_UI;
    {$IFDEF UNICODE}
    // Необязательно, см. http://www.transl-gunsmoker.ru/2015/01/what-does-SEEMASKUNICODE-flag-in-ShellExecuteEx-actually-do.html
    ExecInfo.fMask := ExecInfo.fMask or SEE_MASK_UNICODE;
    {$ENDIF}

    {$WARN SYMBOL_PLATFORM OFF}
    Win32Check(ShellExecuteEx(@ExecInfo));
    {$WARN SYMBOL_PLATFORM ON}
  finally
    if NeedUninitialize then
      CoUninitialize;
  end;
end;

procedure ExecFile(FileName: String);
begin
  ShellExecute(Application.MainFormHandle, 'open', TDirectory.GetCurrentDirectory + 'ipmitool.exe', ' -I lan -U root -P root -H 192.168.0.99 chassis power off', '', SW_SHOWNORMAL);
end;

procedure SleepPC; {Отправить в сон}
var
  hToken: THandle;
  tkp: TTokenPrivileges;
  ReturnLength: Cardinal;
begin
  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY, hToken) then
  begin
    LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
    tkp.PrivilegeCount := 1; // one privelege to set
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
      SetSystemPowerState(true, true);
  end;
end;

//MyExitWindows(EWX_POWEROFF or EWX_FORCE);
function MyExitWindows(RebootParam: Longword): Boolean;
var
  TTokenHd: THandle;
  TTokenPvg: TTokenPrivileges;
  cbtpPrevious: DWORD;
  rTTokenPvg: TTokenPrivileges;
  pcbtpPreviousRequired: DWORD;
  tpResult: Boolean;
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    tpResult := OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
      TTokenHd);
    if tpResult then
    begin
      tpResult := LookupPrivilegeValue(nil,
                                       SE_SHUTDOWN_NAME,
                                       TTokenPvg.Privileges[0].Luid);
      TTokenPvg.PrivilegeCount := 1;
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      cbtpPrevious := SizeOf(rTTokenPvg);
      pcbtpPreviousRequired := 0;
      if tpResult then
        AdjustTokenPrivileges(TTokenHd,
                                      False,
                                      TTokenPvg,
                                      cbtpPrevious,
                                      rTTokenPvg,
                                      pcbtpPreviousRequired);
    end;
  end;
  Result := ExitWindowsEx(RebootParam, 0);
end;


end.




Пример: MyExitWindows(EWX_REBOOT or EWX_FORCE);
...
Рейтинг: 0 / 0
17.07.2020, 12:24
    #39980868
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Евгений Стронгя использовал именно этот код
он НЕ работает

Он и не должен работать. И это чёрным по англицки написано в документации в которую тебя
тычут носом уже второй день.

Может, ты просто по английски не понимаешь? translate.google.com тебе поможет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.07.2020, 12:37
    #39980880
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Евгений Стронг

И потому, что он НЕ работает - я обратился на форум за помощью.

Права на операцию есть?
Из мсдн "The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section."
...
Рейтинг: 0 / 0
17.07.2020, 12:47
    #39980885
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Евгений Стронг
Совершенно верно и в моем сообщении я использовал именно этот код:

Тут кое чего важного не хватает.
...
Рейтинг: 0 / 0
17.07.2020, 12:47
    #39980887
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.3 Функция ExitWindows работает некорректно
Dimitry Sibiryakov
Может, ты просто по английски не понимаешь?

По моей ссылке и вовсе на русском об этом написано.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 10.3 Функция ExitWindows работает некорректно / 25 сообщений из 50, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]