Службы в Windows или как они называются в *nix системах Демоны предназначены для выполнения ряда определенных задач без вмешательства пользователя, таких как FTP сервер, WWW или MySQL. Благодаря Lazarus мы можем создавать такие демоны, используя пакет lazdaemon.
Для того чтобы начать разработку службы\демона, установите пакет lazdaemon, который по умолчанию входит в состав Lazarus. Установить вы его можете как через пункт меню «Пакет/Установка и удаление пакетов», так и через запуск lpk файла из папки: lazarus/components/daemon/lazdaemon.lpk
Итак, как обычно начнем с постановки задачи: Чтобы особо не мудрить создадим простую службу, в которой будет запускаться поток, и заносить в файл некий текст вплоть до ее остановки. Запускаться данная служба должна автоматически при старте системы, иметь имя devlaz.
Приступим. После установки пакеты lazdaemon при создании нового приложения, в конце должны добавится 3-и строки. Нас будет интересовать Приложение-демон (служба)
При создании нового проекта будет открыто автоматически 2 невизуальных формы — класс TDaemon и TDaemonMapper.
TDaemon — непосредственно экземпляр сервиса. Именно этот объект реализует сам сервис (его мы видим в Windows в «Управление компьютерами/Сервисы»). Что требуется выполнить перед\после установкой\удаления службы,
TDaemonMapper — Этот компонент выполняет регистрацию службы в системе. Здесь мы можем написать код, который будет выполнятся после установки демона, его удаления и при его запуске.
В свойствах DaemonMapper1 есть параметр DaemonDefs, выбираем его и жмем добавить:
Добавив новый поток демона и выбрав его, мы должны увидеть его свойства:
DaemonClassName по умолчанию это TDaemon1
Description Это описание нашей службы
DisplayName Отображаемое имя службы
Name Имя службы
Данных свойств достаточно для запуска нашей службы.
Теперь давайте напишем код. Выбрав DaemonUnit1 добавим в исходный код наш поток и опишем в переменной файл в который будет происходить запись:
type { TMyThread } TMyThread = Class(TThread) public procedure Execute; override; end; var Daemon1: TDaemon1; My:TMyThread; FF:TextFile; implementation
добавим следующий код:
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 в шаблон документа ms office ? Т.е. есть шаблон например договора, забиваем данные в форму (номер договора, дата и пр. ) и эти данные вставляются в нужные места в документе.
С уважением Олег
Привет Олег. Вам стоит обратить внимание на компонент FPSpreadsheet, подгружать ваш шаблон и воспользоваться функцией замены текста.
Надо добавить 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;
Здравствуйте. А можете рассказать как сделать так , чтобы приложением созданным в lazarus могли пользоваться определенное время, а потом нужно было вводить лицензионный ключ или другую возможность, чтобы можно было ограничить время использования программы. Чтобы можно было скачать триал версию приложения, а потом если понравилось купить лицензию , ключ или др. За ранее спасибо
Тут нужно определится как вы будете реализовывать данную технологию. Фиксировать запуск программы, записывая время в файл на ПК или где-то в облаке(что мне больше нравится, но тогда надо ограничить запуск при отсутствии интернета.)
Хранить ключ программы в открытом виде в исходнике тоже не стоит, ибо легко можно будет его легко вытащить.
Нужно чтобы 1-ый ключ формировался по определенному алгоритму, жестко привязываясь к железу, далее отправлялся запрос на сервер. Где обрабатывался и присылался уже 2-й ключ программы для данного ПК. Если интернета нет, то активацию можно делать по Е-Маил или телефону.
Увы описать данный код 10-ю строчками не получится. Требуется писать код как в программе, так и на стороне сервера, например php.
Здравствуйте. Хорошая статья. Все понятно изложенно.
Вот если обьяснили как связать службу и моё прлилложенние.
В принципе вам просто надо запустить основные потоки вашего приложения. Больше сказать трудно увидев ваш код.
Зравствуйте!
Спасибо за статью.
Не могли бы вы подсказать как прикрутить к сервису компоненты
TSimpleIPCClient
TSimpleIPCServer
чтобы сервис мог слушать мое приложение и отвечать ему.
У компонента TSimpleIPCServer есть метод MessageQueued который ловит сообщения от клиентов. Не пойму как сделать так, чтобы этот метод срабатывал в созданном потоке?
… а для линукса?