powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 10.3 Функция ExitWindows работает некорректно
25 сообщений из 50, страница 1 из 2
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980692
Всем привет!

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

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



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

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

Гуглишь готовый код прошлого века вместо чтения документации
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-exitwindows
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980718
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
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980720
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.

Так виднее?
...
Рейтинг: 0 / 0
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980723
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
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980724
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980726
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совсем слепой?

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
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980730
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker, а может, если ему выделить на той страничке "Applications should call ExitWindowsEx directly." он додумается открыть хелп по нужной функции? ))
...
Рейтинг: 0 / 0
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980731
Фотография 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.
...
Рейтинг: 0 / 0
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980766
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
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980768
white_nigger
GunSmoker, а может, если ему выделить на той страничке "Applications should call ExitWindowsEx directly." он додумается открыть хелп по нужной функции? ))


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

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

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


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

Так и подставляй EWX_REBOOT, при чем тут 0 (который = EWX_LOGOFF)
...
Рейтинг: 0 / 0
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980823
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
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980825
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)
...
Рейтинг: 0 / 0
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980828
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений Стронг
Функция ExitWindowsEx подразумевает ДВА параметра. Я это и пытаюсь выяснить уже на протяжении какого сообщения. 0 - параметр для логоффа, а какой для EWX_REBOOT? Что подставить вместо 0? Так понятнее?

Зачем пытаться выяснить, ты не можешь по ссылке в MSDN, которую сам же привел, описание прочитать?
...
Рейтинг: 0 / 0
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980834
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
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980836
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Стронг,
Обратите внимание на
Код: plaintext
1.
#define ExitWindows(dwReserved, Code) ExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)


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


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



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


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

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

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

Код: 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
Delphi 10.3 Функция ExitWindows работает некорректно
    #39980868
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Стронгя использовал именно этот код
он НЕ работает

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

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

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

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

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

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


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