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

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

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

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

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

6 ответов


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

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


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

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

плюсы:

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

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

пример 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.

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


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

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

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

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

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


вы можете попробовать использовать svrany, инструменты для запуска приложения как службы. Это части инструментов набора ресурсов сервера. попробуйте эту ссылку для 2003 server resource kit download.


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


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