Преобразование приложения 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 для взаимодействия с вашим сервисом (посредством взаимодействия это означает просмотр и взаимодействие с вашими формами обслуживания).
Ответ 4
Вы можете попробовать использовать svrany, инструменты для запуска приложения в качестве сервиса.
Это части инструментов набора ресурсов сервера.
попробуйте эту ссылку для загрузки ресурсов сервера ресурсов 2003.
Ответ 5
Это немного зависит от вашего приложения, но в целом оно достижимо. Попробуйте следующее: http://iain.cx/src/nssm. Не забудьте запустить все службы, от которых зависит ваше приложение, прежде чем вы начнете свое приложение в качестве сервиса. Google для получения информации о том, как это сделать.
Ответ 6
Вы можете написать простой сервис, который запускает ваше приложение. Но если вы заботитесь о будущем своего приложения, я бы пошел на службу. Да, вам придется разделить приложение на две части: часть клиент /GUI и сама служба, тем более что Vista и 7 значительно усложнили задачу отображения пользовательского интерфейса по соображениям безопасности.
У служб есть несколько преимуществ, они запускаются в отдельном сеансе, их можно настроить для работы с данным пользователем, который может отличаться от зарегистрированного, только пользователь с надлежащими правами может управлять ими, Windows может автоматически перезапустить их (или выполнить другие действия), когда они терпят неудачу.