Преобразование приложения Delphi для запуска в качестве сервиса - это необходимо?

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

Один пользователь попросил изменить приложение на то, что он может быть запущен как служба. Его аргументация заключается в том, что приложение может быть запущено во время загрузки и запускаться без какого-либо входа в систему и будет доступно независимо от того, кто вошел в систему.

Мой вопрос заключается в следующем: есть ли какое-либо другое решение, которое позволит мне установить приложение, поскольку оно существует, так что оно все равно будет работать без входа пользователя и будет доступно для всех пользователей?

У меня возникает ощущение, что преобразование приложения для запуска в качестве сервиса не является тривиальным. Я предполагаю, что вам понадобится 2 приложения - "безголовое" приложение-служба и графический интерфейс, который запускается пользователями по запросу, которые могут взаимодействовать с сервисом (комментарии также приветствуются здесь).

Ответ 1

Существуют коммерческие (и бесплатные) решения, такие как Firedaemon, которые будут работать (почти) любое приложение как услуга.

В обойме не должно быть сложно отделить логику и пользовательский интерфейс - вы должны были это сделать уже при разработке приложения. Просто потому, что Delphi упрощает запись бизнес-логики в код, связанный с пользовательским интерфейсом, это не значит, что вы действительно должны это делать. Взгляните на образец презентации на сайте Мартина Фаулера.

Ответ 2

Я обычно создаю свое приложение таким образом, что его можно запустить как службу или графический интерфейс с помощью командной строки /GUI.

Когда приложение запускается с графическим интерфейсом, я создаю экземпляр и запускаю класс службы "вручную".

Преимущества:

  • Он будет запускать тот же код, что очень упрощает отладку службы. Вы можете просто поставить контрольные точки и выполнить свой код без необходимости "прикреплять" к запущенному приложению.

  • Из-за GUI вы можете видеть, что будет делать ваша служба, и взаимодействовать с ней через списки и кнопки, даже на удаленных серверах, где у вас нет отладчика. Необходимость взаимодействовать с вашим сервисом через журналы и конфигурации - дерьмовая и медленная.

Пример dpr, из проекта, который работает следующим образом:

program xxxx;

uses 
  SysUtils,
  SvcMgr,
  .......;

{$R *.res}

begin
  GlobalAppId := 1;
  MapMatcherController := TMapMatcherController.Create(nil);
  try
    if FindCmdLineSwitch('GUI',['/','-'],True) then
    begin
      Forms.Application.Initialize;
      Forms.Application.MainFormOnTaskbar := True;
      Forms.Application.CreateForm(TfrmMain, frmMain);
      Forms.Application.Run;
    end
    else
    begin
      SvcMgr.Application.Initialize;
      SvcMgr.Application.CreateForm(TsrvMapMatcher2, srvMapMatcher2);
      SvcMgr.Application.Run;
    end;
  finally
    MapMatcherController.Free;
 end;
end.

О, еще одна вещь, о которой нужно помнить, заключается в том, что службы обычно запускаются как "системные" пользователи, что означает, что у вас будут разные привилегии и настройки (например, сопоставление букв диска).

Ответ 3

В общем, возможно иметь смешанный один exe, который, в свою очередь, работает как служба или работает как полноценное стандартное приложение GUI.

Сколько усилий ваше приложение должно соответствовать этой категории - вопрос о том, как он разработан, особенно в том виде, как он связан между бизнес-логикой и логикой пользовательского интерфейса.

Один замечательный пример такого приложения поставляется с самой Delphi: scktsrvr.exe в вашем каталоге $DELPHI\bin выполняется как приложение GUI или как служба (запустите scktsrvr.exe/install для автоматически зарегистрируйте сервис и используйте консоль управления, чтобы запустить/остановить его.

в папке $DELPHI\source\db вы найдете файлы проекта (scktsrvr.dpr/res, ScktCnst.pas, ScktMain.pas/dfm). Не спешите проверять, как это делается, и кто знает... возможно, это то, что вы ищете для своего приложения.

Принимайте во внимание, так как интерактивные службы Windows Vista не могут взаимодействовать с пользователем на рабочем столе. Администратор должен включить обнаружение интерактивных сервисов, и пользователь должен перейти на рабочий стол 0 для взаимодействия с вашим сервисом (посредством взаимодействия это означает просмотр и взаимодействие с вашими формами обслуживания).

Ответ 5

Это немного зависит от вашего приложения, но в целом оно достижимо. Попробуйте следующее: http://iain.cx/src/nssm. Не забудьте запустить все службы, от которых зависит ваше приложение, прежде чем вы начнете свое приложение в качестве сервиса. Google для получения информации о том, как это сделать.

Ответ 6

Вы можете написать простой сервис, который запускает ваше приложение. Но если вы заботитесь о будущем своего приложения, я бы пошел на службу. Да, вам придется разделить приложение на две части: часть клиент /GUI и сама служба, тем более что Vista и 7 значительно усложнили задачу отображения пользовательского интерфейса по соображениям безопасности. У служб есть несколько преимуществ, они запускаются в отдельном сеансе, их можно настроить для работы с данным пользователем, который может отличаться от зарегистрированного, только пользователь с надлежащими правами может управлять ими, Windows может автоматически перезапустить их (или выполнить другие действия), когда они терпят неудачу.