powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
9 сообщений из 9, страница 1 из 1
Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
    #40066282
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте,

Уже похожих топиков создано много, но задача всё еще актуальна и четких ответов как ее решить, пока не нашел.

Суть задачи : при завершении Windows нужно не дать завершиться службе, выполнить копирование файлов на другой диск (5-10 минут) и только после этого завершить работу ПК.

В обычном приложении, которое работает под пользователем, мы просто ловим WM_QUERYENDSESSION

В службе я создал невидимое окно, чтобы ловить оконные сообщения, но что-то WM_QUERYENDSESSION не ловится, хотя другие сообщения в этой же форме, такие как WM_DEVICECHANGE, WM_POWERBROADCAST, ловятся нормально.
Пробовал даже на FormCloseQuery установить CanClose:=false, но OnCloseQuery почему-то не срабатывает.

Может я неправильно вообще делаю и надо обработать TService.OnServiceShutdown и там что-то установить, чтобы не дать винде завершиться?
Или в службе предотвратить завершение винды впринципе невозможно?

Заранее за советы спасибо.
...
Рейтинг: 0 / 0
Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
    #40066288
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переходишь в состояние SERVICE_STOP_PENDING и пока работаешь - регулярно его обновляешь,
увеличивая счётчик. Винда видит это и спокойно ждёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
    #40066322
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Собственно, я так и делал. В обработчике TService.OnServiceShutdown с целью тестирования я сделал такой цикл:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  Log('ждем 3 минуты...');
  for i:=1 to 180 do
  begin
    status:=csStopPending; 
    TMyService.ReportStatus; // внутри ReportStatus уже есть увеличение счетчика Inc(dwCheckPoint)
    sleep(1000);
    Log('i='+IntToStr(i));
  end;
  Log('ожидание закончено.');


Как только TService.OnServiceShutdown сработал, судя по логу выдало i=1 и i=2, прошло всего 2 сек и служба вырубилась.
...
Рейтинг: 0 / 0
Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
    #40066334
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
27.04.2021 13:42, m52 пишет:
> Собственно, я так и делал.

нет.
тебе нужно напрямую работать со структурой SERVICE_STATUS
и инкрементировать в ней поле dwCheckPoint.
https://docs.microsoft.com/en-us/windows/win32/api/winsvc/ns-winsvc-service_status
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
    #40066337
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О кривых обёртках я ничего сказать не могу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
    #40066360
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
27.04.2021 14:04, Dimitry Sibiryakov пишет:
> О кривых обёртках я ничего сказать не могу.

посмотрел исходники TService.
метод ReportStatus по идее должен инкрементировать dwCheckPoint,
но написано там как-то уж очень черезжопно.
не уверен, что работоспособно.


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
    #40066366
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Впрочем, я тоже был неправ, сервис не может значительно задержать остановку Windows:
https://docs.microsoft.com/en-us/windows/win32/services/service-control-handler-function
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
    #40066369
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52,

можно попробовать использовать SERVICE_CONTROL_PRESHUTDOWN, правда 5-10 минут наверное не расчитано, но пишут что будет ждать пока не выйдет из обработчика
...
Рейтинг: 0 / 0
Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
    #40066526
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

если я правильно понимаю, то выводится сообщение винды при шатдауне "ждать или не ждать", и если я нажму "не ждать", то сервис автора всё равно с копированием обломится.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не дать завершиться Windows из службы (WM_QUERYENDSESSION ?)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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