Создание сервиса Windows

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Создание сервиса Windows

Сообщение Vodnik » 11.10.2019 12:47:21

Всем привет,
Вроде всё описано в WiKi, есть примеры cleandirs (в examples) и msapTemp (https://forum.lazarus.freepascal.org/index.php?topic=22983.0), но оба примера не работают (ничего не пишут в лог, ошибки при остановке из Control Panel - Services).
Windows 7, Lazarus 2.0.4
Кому-нибудь удалось создать работоспособный Windows процесс в Lazarus?
Vodnik
новенький
 
Сообщения: 37
Зарегистрирован: 24.12.2016 01:14:23

Re: Создание сервиса Windows

Сообщение alexs » 11.10.2019 12:57:26

А какая ошибка? Должно работать.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3879
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Создание сервиса Windows

Сообщение Vodnik » 11.10.2019 13:43:50

Ну например при остановке сервиса из примера msapTemp:
Windows could not stop the TDaemon1 service on Local Computer.
The service did not return an error. This could be an internal Windows error or an internal service error.
В итоге сервис остановить невозможно. То же при Pause.
Сервис TDaemon1 при работе должен писать информацию в лог, этого не происходит.

В примере cleandirs вообще отсутствует возможность остановить сервис, хотя событие onStop задано.
Vodnik
новенький
 
Сообщения: 37
Зарегистрирован: 24.12.2016 01:14:23

Re: Создание сервиса Windows

Сообщение alexs » 11.10.2019 14:32:33

Так надо обработать соответсвующие события:
Вот кусок из моего проекта:
Код: Выделить всё
  TsiImportDaemon = class(TDaemon)
    procedure DataModuleContinue(Sender: TCustomDaemon; var OK: Boolean);
    procedure DataModuleExecute(Sender: TCustomDaemon);
    procedure DataModulePause(Sender: TCustomDaemon; var OK: Boolean);
    procedure DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
    procedure DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
  private
....
{ TsiImportDaemon }

procedure TsiImportDaemon.DataModuleContinue(Sender: TCustomDaemon;
  var OK: Boolean);
begin
  OK:=false;
  if Assigned(FsmsImportFileModule) then
  begin
    FPaused:=false;
    OK:=true
  end;
end;

procedure TsiImportDaemon.DataModuleExecute(Sender: TCustomDaemon);
begin
  repeat
    if FPaused then
      OnWriteLogEvent(nil, 'TsiImportDaemon.Paused = true')
    else
    if Assigned(FsmsImportFileModule) then
      FsmsImportFileModule.Timer1Timer(nil);
    Sleep(FsmsImportFileModule.TimerInterval);
  until FTerminated;
end;

procedure TsiImportDaemon.DataModulePause(Sender: TCustomDaemon; var OK: Boolean
  );
begin
  OK:=false;
  if Assigned(FsmsImportFileModule) then
  begin
    FPaused:=true;
    OK:=true;
  end;
end;

procedure TsiImportDaemon.DataModuleStart(Sender: TCustomDaemon; var OK: Boolean
  );
begin
  OnWriteLogEvent(nil, 'TsiImportDaemon.DataModuleStart');
  FTerminated:=false;
  FPaused:=false;
  FsmsImportFileModule:=TsmsImportFileModule.Create(nil);
  FsmsImportFileModule.OnWriteLog:=@OnWriteLogEvent;
  FsmsImportFileModule.OnIterate:=@OnIterate;
  FsmsImportFileModule.LoadConfig;
  OK:=true;
end;

procedure TsiImportDaemon.DataModuleStop(Sender: TCustomDaemon; var OK: Boolean
  );
begin
  if Assigned(FsmsImportFileModule) then
  begin
    FTerminated:=true;
    FreeAndNil(FsmsImportFileModule);
  end;
  OK:=true;
end;



Добавлено спустя 1 минуту 45 секунд:
Правда сейчас он работает в линухе - но начинал я его писать ещё в винде. Так что - кросплатформено.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3879
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Создание сервиса Windows

Сообщение Vodnik » 11.10.2019 16:30:07

Конечно, обработчики есть! Это работавшие ранее примеры.
Судя по англоязычному форуму, LazDaemon когда-то успешно работал, а где-то в 2011-2014 начались проблемы. Ни одного решения я не нашёл. Под линуксом вроде всё ОК.
Вы не пробовали свой проект откомпилировать транковым Лазарусом и запустить под Виндой?
Vodnik
новенький
 
Сообщения: 37
Зарегистрирован: 24.12.2016 01:14:23

Re: Создание сервиса Windows

Сообщение alexs » 12.10.2019 14:21:51

Вот как раз в линух я переехал в 2014 году с ним :-)
Попробую
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3879
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Создание сервиса Windows

Сообщение alexs » 14.10.2019 09:11:20

Дествительно - в винде7 есть такой глюк
Сам сервис работает. Но не воспринимает управляющие команды.
Мне интересно - а в XP/Win2003 -тоже не будет работать?
т.е. это в FPC сломали или не совместимость версий ОС?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3879
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Создание сервиса Windows

Сообщение Vodnik » 15.10.2019 10:26:29

Мне и сам сервис заставить работать не удалось. :(
Поищу комп с XP, проверю на серверах.
Только... что дальше-то?
Ну напишу я bug report, они там годами висят
Vodnik
новенький
 
Сообщения: 37
Зарегистрирован: 24.12.2016 01:14:23

Re: Создание сервиса Windows

Сообщение alexs » 15.10.2019 11:20:38

на XP/2003 точно всё работало
Т.е. если не заработает - можно просто попытаться найти ревизию - в которой сломали. Не так уж много там правок было.
Если заработает - надо читать доки по винде - в чём не совместимость между версиями.

Но я тоже больше склоняюсь к версии что сломали в FPC.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3879
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Создание сервиса Windows

Сообщение Снег Север » 15.10.2019 12:22:46

Lazarus 2.0.4
Windows 10 x64

Сделал пример отсюда:
https://devlaz.ru/daemons-in-lazarus/

работает нормально - инсталируется и деинсталируется по ключам
только запускать и останавливать надо из управления сервисами
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2264
Зарегистрирован: 27.11.2007 16:14:47

Re: Создание сервиса Windows

Сообщение alexs » 15.10.2019 14:47:29

Снег Север
Проблема в обработке приостановки - продолжения
У меня тоже сервис устанавливается, стартует, останавливается и деирсталируется нормально.
А вот событие на паузу/продолжение - почемуто не работает.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 3879
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Создание сервиса Windows

Сообщение Снег Север » 15.10.2019 15:46:28

alexs писал(а):А вот событие на паузу/продолжение - почемуто не работает.

Вы имеет ввиду события DataModulePause и DataModuleContinue в коде? У меня в примере работают, вижу в логе сообщения, которые я в них создаю. Паузу и продолжение делаю через управление сервисами.

Добавлено спустя 2 минуты 25 секунд:
вот куски кода:
Код: Выделить всё
var
  Daemon1: TDaemon1;
  My:TMyThread;
  FF:TextFile;
  mydata:string;
...
procedure TDaemon1.DataModuleContinue(Sender: TCustomDaemon; var OK: Boolean);
begin
    mydata := 'continue';
end;

procedure TDaemon1.DataModulePause(Sender: TCustomDaemon; var OK: Boolean);
begin
     mydata := 'paused';
end;

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

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

procedure TMyThread.Execute;
var i:integer;
begin
  AssignFile(FF,'D:\000\log.txt');
  rewrite(FF);
  i := 0;
  repeat
     if mydata <>'' then
     begin
          writeln(FF,mydata);
          mydata := '';
     end;
     writeln(FF,'OK '+IntToStr(I));
     inc(I);
     sleep(2000);
  until Terminated;
end;               
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2264
Зарегистрирован: 27.11.2007 16:14:47

Re: Создание сервиса Windows

Сообщение Vodnik » 16.10.2019 12:27:52

Чертовщина какая-то... Скачал файл devlaz.exe (скомпилированный в 2016 старым добрым Лазарусом), установил, стартовал - всё ОК. Пытаюсь остановить через сервисы - Windows выдаёт всё ту же ошибку:
"Windows could not stop the DevLaz.ru Welcome service on Local Computer.
The service did not return an error. This could be an internal Windows error or an internal service error."
Сервис не останавливается.
При повторной попытке остановить - ошибка уже другая:
"Windows could not stop the DevLaz.ru Welcome service on Local Computer.
Error 1061: The service cannot accept control messages at this time."
Но сервис после этого ОСТАНАВЛИВАЕТСЯ.
Не могу понять, почему у Вас работает, у меня - нет...
Я бы подумал, что у меня руки кривые или проблема с ОС, но я проверил на других компах под Windows 7, на старом ноуте с Windows XP, на серверах 2008 R2 и 2012 - везде поведение одинаковое!
Vodnik
новенький
 
Сообщения: 37
Зарегистрирован: 24.12.2016 01:14:23

Re: Создание сервиса Windows

Сообщение Снег Север » 16.10.2019 13:02:27

Vodnik Я создал новый проект daemon и вписывал в него код из статьи сам. Может быть дело именно в этом. Кстати, у меня лазарь стабильный, не транковый.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2264
Зарегистрирован: 27.11.2007 16:14:47

Re: Создание сервиса Windows

Сообщение Vodnik » 16.10.2019 13:13:14

Заработало!!!
Добавил события OnPause и OnContinue, как предложил Снег Север, скомпилировал в Lazarus 2.0.4 - теперь и сервис работает (пишет в файл, правда, не непрерывно, а пачками по 36 сообщений), и все события отрабатывает без ошибок.
Честно говоря, не уловил, в чём секрет.
Может, обработчики событий OnPause и OnContinue для сервиса Windows - обязательные?..
Заметил, что пример Devlaz в отличие от Cleandirs в обработчиках не возвращает значение переменной ОК.

Добавлено спустя 19 минут 50 секунд:
Нет, удалил обработчики OnPause и OnContinue - всё равно работает, причём выполняет пункты меню Windows Services паузы и возобновления.
В общем, непонятно как, но проблема решена.
Спасибо, alexs и Снег Север!
Vodnik
новенький
 
Сообщения: 37
Зарегистрирован: 24.12.2016 01:14:23


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru