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

Различия в запуске приложений на Delphi: встроенные службы против обычного приложения и настройка поведения

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

При разработке Windows Service приложений на Delphi часто возникает вопрос о том, как отличить запуск приложения в обычном режиме от запуска в режиме службы. Вопрос особенно актуален, когда требуется создать конфигуратор для службы, который мог бы запускаться при двойном клике по исполняемому файлу службы.

Проблема

Разработчик создал приложение Windows Service с использованием шаблона Delphi IDE и успешно установил и запустил его через Панель управления службами. Теперь перед ним стоит задача создать конфигуратор для службы, который мог бы запускаться при двойном клике по исполняемому файлу службы. Вопросы, которые возникают в данном контексте:

  1. Как служба отличает обычный запуск от запуска в режиме службы?
  2. Можно ли использовать простой запуск для выполнения действий, отличных от режима службы, и не нарушит ли это функционирование в режиме службы?

Решение

Для ответа на вопросы необходимо обратить внимание на код, расположенный в TServiceApplication.CreateForm в модуле Vcl.SvcMgr. Это ключевой момент, который позволяет определить, был ли запущен сервис в обычном режиме или в режиме службы.

Для реализации конфигуратора можно модифицировать исходный код сервиса следующим образом:

begin
  if FindCmdLineSwitch('config', ['-', '/'], True) then
    TMyForm.Run
  else
  begin
    if not Application.DelayInitialize or Application.Installing then
      Application.Initialize;
    Application.CreateForm(TSvc_MyService, Svc_MyService);
    Application.Run;
  end;
end.

Здесь TMyForm.Run - это классовая процедура на основном GUI форме, которая запускается при наличии параметра запуска конфигуратора.

class procedure TMyForm.Run;
begin
  TThread.NameThreadForDebugging('FormRunner');
  ReportMemoryLeaksOnShutdown := DebugHook <> 0;
  Forms.Application.Initialize;
  Forms.Application.ShowMainForm := True;
  Forms.Application.MainFormOnTaskBar := True;
  Forms.Application.CreateForm(TMyForm, MyForm);
  Forms.Application.Run;
end;

Это позволяет запустить сервис как обычное приложение с форм-интерфейсом при использовании указанного параметра запуска.

Обновление

Различие между обычным запуском и запуском в режиме службы часто делается в процедуре TServiceStartThread.Execute. В случае, если сервис запущен не в режиме службы, генерируется сообщение WM_QUIT, которое приводит к завершению цикла обработки сообщений.

procedure TServiceStartThread.Execute;
begin
  if StartServiceCtrlDispatcher(FServiceStartTable[0]) then
    ReturnValue := 0
  else
    ReturnValue := GetLastError; // Код 1063, если запущен как приложение
end;

Цикл обработки сообщений в TServiceApplication.Run завершается при получении сообщения WM_QUIT.

procedure TServiceApplication.Run;
begin
  ....
  while not Vcl.Forms.Application.Terminated do
  try
    Vcl.Forms.Application.HandleMessage;
  except
    on E: Exception do
      DoHandleException(E);
  end;
  ....
end;

Для более глубокого понимания вопроса можно обратиться к следующим ресурсам:

Заключение

Использование встроенного в Delphi шаблона для создания Windows Service позволяет легко запускать приложение в режиме службы, однако для реализации дополнительных функций, таких как конфигуратор, необходимо внимательно изучить внутреннюю работу сервисного приложения и правильно настроить его поведение в зависимости от параметров запуска.

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

Разработка Windows Service приложений на Delphi и настройка их поведения при запуске в обычном режиме и в режиме службы.


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

Получайте свежие новости и обновления по 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:17:25/0.0032579898834229/0