Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как правильно выключить компьютер через Delphi на Windows 10 Enterprise: Решение проблемы

Delphi , ОС и Железо , Windows

Вопрос, который вы задали, связан с разработкой приложения на Delphi, которое должно позволить полностью выключить компьютер после закрытия всех открытых приложений. Проблема заключается в том, что код, который вы написали, вместо полного выключения компьютера, приводит к выходу пользователя из системы, но не выполняет полное выключение ПК. Это происходит на компьютерах с Windows 10 Enterprise.

Шаг 1: Проверка параметров командной строки

Первоначально, проблема была в неправильной обработке параметров командной строки. Вы должны были получить доступ к параметрам через свойство Options объекта TCommandLineParameter, а не Param. В вашем коде при вызове приложения с командой:

- -w -a shutdown -t 45

FindByParam(CMD_ACTION) возвращал объект TCommandLineParameter, у которого Param был равным 'a', а Options - равным 'shutdown'. Однако вы искали совпадение строки в Param, а не в Options, что приводило к тому, что вы не находили совпадение и вызывали функцию ExitWindowsEx() с флагом по умолчанию EWX_LOGOFF, вместо ожидаемого EWX_POWEROFF.

Шаг 2: Исправление кода

Вам необходимо изменить обработку параметров командной строки следующим образом:

procedure TfrmCleanShutdown.ProcessCommandLine;
begin
  // ... (код для других параметров)

  cmd := cmdl.FindByParam(CMD_ACTION);
  if Assigned(cmd) then
  begin
    if cmd.Options = S_SHUTDOWN then
      FAction := EWX_POWEROFF or EWX_FORCEIFHUNG
    else if cmd.Options = S_RESTART then
      FAction := EWX_REBOOT or EWX_FORCEIFHUNG
  end;
end;

Шаг 3: Удаление ненужного кода

Также вы можете убрать класс TCommandLineParameterList, так как в стандартной библиотеке Delphi есть функция SysUtils.FindCmdLineSwitch(), которая может выполнить ту же работу:

uses
  ..., System.SysUtils;

procedure TfrmCleanShutdown.ProcessCommandLine;
begin
  // ... (обработка параметров с помощью SysUtils.FindCmdLineSwitch)
end;

Шаг 4: Настройка привилегий

Для выключения или перезагрузки системы необходимо включить привилегию SE_SHUTDOWN_NAME с помощью функции AdjustTokenPrivileges(). Это требование, указанное в документации Microsoft:

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

Шаг 5: Отладка

Проверьте, что вы действительно вызываете ExitWindowsEx() с флагом EWX_POWEROFF, используя отладчик.

Выводы:

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

Создано по материалам из источника по ссылке.

Пользователь столкнулся с проблемой в разработке приложения на Delphi, которое должно выполнять полное выключение компьютера, но вместо этого происходит только выход из системы на компьютерах с Windows 10 Enterprise.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:12:17/0.0032081604003906/0