Можно ли сделать потомком TService и опубликовать мои собственные свойства? - PullRequest
3 голосов
/ 12 февраля 2012

После создания нескольких различных служб в Delphi я понял, что TService не хватает некоторых необходимых вещей, которые должны поставляться с приложением-службой, таких как ведение журнала, обработка исключений и свойство 'Description' вреестра.

Мне было интересно, можно ли мне сделать свою собственную служебную оболочку, такую ​​как TJDService, которая унаследована от TService, но с некоторыми дополнительными вещами, такими как свойство 'Description', показывающеев объекте инспектора.Могу ли я сделать свою собственную служебную оболочку, как это?Я знаю, что могу сделать свой собственный «проект по умолчанию», унаследованный от TService, но он включает в себя весь мой код с любым новым проектом.

Когда создается новый сервис, он должен выглядеть так:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.SvcMgr,
  JDServices;

type
  TJDService1 = class(TJDService)
  private

  public
    function GetServiceController: TServiceController; override;
  end;

var
  JDService1: TJDService1;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  JDService1.Controller(CtrlCode);
end;

function TJDService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

end.

То же, что и обычная служба, но вместо TService.

используется мой TJDService.

Ответы [ 4 ]

6 голосов
/ 12 февраля 2012

Простой вопрос с простым ответом. Да, ты можешь это сделать. Я делаю именно это для обмена кодом между различными службами, которые реализованы в кодовой базе моей компании.

RegisterCustomModule - это способ отображения свойства Description в Инспекторе объектов. Сказав это, я не считаю, что возможность устанавливать эти свойства службы в Инспекторе объектов является столь ценной. Я считаю вполне приемлемым устанавливать их во время выполнения в коде, но это решение зависит от личных предпочтений.

Даже если вы используете RegisterCustomModule, чтобы сделать класс обслуживания известным в IDE, новое приложение-служба по умолчанию не будет использовать ваш класс обслуживания. Вы можете настроить приложение-службу по умолчанию в соответствии со своими потребностями, а затем сохранить его в Хранилище объектов .

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

3 голосов
/ 13 февраля 2012

Да, вы можете и ниже ссылку о том, как это сделать

http://www.marcocantu.com/ddh/ddh15/ddh15e.htm

2 голосов
/ 13 февраля 2012

Если вы не хотите выполнять эту работу самостоятельно SvCom предлагает хороший набор инструментов для создания сервисов в Delphi, которые предоставляют гораздо больше, чем доступно из коробки.

1 голос
/ 13 февраля 2012

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

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

...