Преобразование приложения Delphi для запуска в качестве службы - нужно ли это? - PullRequest
10 голосов
/ 05 ноября 2010

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

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

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

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

Ответы [ 6 ]

24 голосов
/ 05 ноября 2010

Я обычно создаю свое приложение таким образом, чтобы его можно было запустить как службу или как графический интерфейс, используя переключатель командной строки /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.

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

7 голосов
/ 05 ноября 2010

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

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

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

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

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

7 голосов
/ 05 ноября 2010

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

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

2 голосов
/ 08 ноября 2010

Вы можете попробовать использовать svrany, инструмент для запуска приложения в качестве службы. Это часть Инструментов Ресурса Сервера. попробуйте эту ссылку для загрузки комплекта ресурсов сервера 2003 .

1 голос
/ 05 ноября 2010

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

1 голос
/ 05 ноября 2010

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

...