Создание службы в Lazarus

DaemonСлужбы в Windows или как они называются в *nix системах Демоны предназначены для выполнения ряда определенных задач без вмешательства пользователя, таких как FTP сервер, WWW или MySQL.  Благодаря Lazarus мы можем создавать такие демоны, используя пакет lazdaemon.

Для того чтобы начать разработку службы\демона, установите пакет lazdaemon, который по умолчанию входит в состав Lazarus. Установить вы его можете как через пункт меню «Пакет/Установка и удаление пакетов», так и через запуск lpk файла из папки: lazarus/components/daemon/lazdaemon.lpk

Итак, как обычно начнем с постановки задачи: Чтобы особо не мудрить создадим простую службу, в которой будет запускаться поток, и заносить в файл некий текст вплоть до ее остановки. Запускаться данная служба должна автоматически при старте системы, иметь имя devlaz.

Приступим. После установки пакеты lazdaemon при создании нового приложения, в конце должны добавится 3-и строки. Нас будет интересовать Приложение-демон (служба)

1

При создании нового проекта будет открыто автоматически 2 невизуальных формы — класс TDaemon и TDaemonMapper.

TDaemon — непосредственно экземпляр сервиса. Именно этот объект реализует сам сервис (его мы видим в Windows в «Управление компьютерами/Сервисы»). Что требуется выполнить перед\после установкой\удаления службы,

TDaemonMapper — Этот компонент выполняет регистрацию службы в системе. Здесь мы можем написать код, который будет выполнятся после установки демона, его удаления и при его запуске.

В свойствах DaemonMapper1 есть параметр DaemonDefs, выбираем его и жмем добавить:

DaemonMapper

Добавив новый поток демона и выбрав его, мы должны увидеть его свойства:

Daemon

DaemonClassName по умолчанию это TDaemon1

Description Это описание нашей службы

DisplayName Отображаемое имя службы

Name Имя службы

Данных свойств достаточно для запуска нашей службы.

Теперь давайте напишем код. Выбрав DaemonUnit1 добавим в исходный код наш поток и опишем в переменной файл в который будет происходить запись:

type

{ TMyThread }

 TMyThread = Class(TThread)
  public
    procedure Execute; override;
end;

var
  Daemon1: TDaemon1; 
  My:TMyThread;
  FF:TextFile;

implementation

Далее на событие OnStart
DaemonUnit

добавим следующий код:

procedure TDaemon1.DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
begin
  My:=TMyThread.Create(False);
end;

OnStop:

procedure TDaemon1.DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
begin
  My.Terminate;
  CloseFile(FF);
end;

Ну и опишем код нашего потока:

procedure TMyThread.Execute;
var i:integer;
begin
  AssignFile(FF,'D:\log.txt');
  rewrite(FF);

  repeat
     writeln(FF,'OK '+IntToStr(I));
     inc(I);
     sleep(2000);
  until Terminated;

end;

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

Службы

Ждем примерно 10 секунд и останавливаем ее отсюда же. В результате чего в файле D:\log.txt должны появится записи свидетельствующие о работе потока.

Для удаления службы из систему требуется указать ключ -u

Путь до службы желателен без русских символов.

Доп. информацию вы можете прочесть на сайте Wiki

Скачать готовый проект

Создание службы в Lazarus обновлено: 22 февраля, 2017 автором: Oleg E.
Share

10 комментариев “Создание службы в Lazarus

  1. Здравствуйте!
    Не могли бы вы описать процесс вывода данных из формы сделанной в Lazarus в шаблон документа ms office ? Т.е. есть шаблон например договора, забиваем данные в форму (номер договора, дата и пр. ) и эти данные вставляются в нужные места в документе.
    С уважением Олег

      • Надо добавить Utf8ToSys а то не будет работать с кириллицей
        WordApp.Selection.Find.Text:= WideString(Utf8ToSys(‘Текст’));
        WordApp.Selection.Text:= WideString(Utf8ToSys(‘Привет’));

    • uses
      comobj;
      procedure TForm1.Button1Click(Sender: TObject);
      var
      WordApp:OleVariant;
      begin
      WordApp:=CreateOleObject(‘Word.Application’);

      WordApp.Documents.Open(‘d:\test.doc’); //Документ уже должен быть создан

      {Ищем и заменяем текст}
      WordApp.Selection.Find.Forward:= True;
      WordApp.Selection.Find.Text:= WideString(‘текст’);
      if WordApp.Selection.Find.Execute then
      WordApp.Selection.Text:= WideString(‘Привет’);
      WordApp.ActiveDocument.Save;
      end;

  2. Здравствуйте. А можете рассказать как сделать так , чтобы приложением созданным в lazarus могли пользоваться определенное время, а потом нужно было вводить лицензионный ключ или другую возможность, чтобы можно было ограничить время использования программы. Чтобы можно было скачать триал версию приложения, а потом если понравилось купить лицензию , ключ или др. За ранее спасибо

    • Тут нужно определится как вы будете реализовывать данную технологию. Фиксировать запуск программы, записывая время в файл на ПК или где-то в облаке(что мне больше нравится, но тогда надо ограничить запуск при отсутствии интернета.)
      Хранить ключ программы в открытом виде в исходнике тоже не стоит, ибо легко можно будет его легко вытащить.
      Нужно чтобы 1-ый ключ формировался по определенному алгоритму, жестко привязываясь к железу, далее отправлялся запрос на сервер. Где обрабатывался и присылался уже 2-й ключ программы для данного ПК. Если интернета нет, то активацию можно делать по Е-Маил или телефону.
      Увы описать данный код 10-ю строчками не получится. Требуется писать код как в программе, так и на стороне сервера, например php.

  3. Здравствуйте. Хорошая статья. Все понятно изложенно.
    Вот если обьяснили как связать службу и моё прлилложенние.

    • В принципе вам просто надо запустить основные потоки вашего приложения. Больше сказать трудно увидев ваш код. smile

  4. Зравствуйте!
    Спасибо за статью.
    Не могли бы вы подсказать как прикрутить к сервису компоненты
    TSimpleIPCClient
    TSimpleIPCServer
    чтобы сервис мог слушать мое приложение и отвечать ему.
    У компонента TSimpleIPCServer есть метод MessageQueued который ловит сообщения от клиентов. Не пойму как сделать так, чтобы этот метод срабатывал в созданном потоке?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *