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

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

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

Ответить
Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

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

Сообщение Vodnik »

Всем привет,
Вроде всё описано в 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?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

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

Сообщение alexs »

А какая ошибка? Должно работать.
Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

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

Сообщение Vodnik »

Ну например при остановке сервиса из примера 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 задано.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

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

Сообщение alexs »

Так надо обработать соответсвующие события:
Вот кусок из моего проекта:

Код: Выделить всё

  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 секунд:
Правда сейчас он работает в линухе - но начинал я его писать ещё в винде. Так что - кросплатформено.
Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

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

Сообщение Vodnik »

Конечно, обработчики есть! Это работавшие ранее примеры.
Судя по англоязычному форуму, LazDaemon когда-то успешно работал, а где-то в 2011-2014 начались проблемы. Ни одного решения я не нашёл. Под линуксом вроде всё ОК.
Вы не пробовали свой проект откомпилировать транковым Лазарусом и запустить под Виндой?
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

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

Сообщение alexs »

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

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

Сообщение alexs »

Дествительно - в винде7 есть такой глюк
Сам сервис работает. Но не воспринимает управляющие команды.
Мне интересно - а в XP/Win2003 -тоже не будет работать?
т.е. это в FPC сломали или не совместимость версий ОС?
Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

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

Сообщение Vodnik »

Мне и сам сервис заставить работать не удалось. :(
Поищу комп с XP, проверю на серверах.
Только... что дальше-то?
Ну напишу я bug report, они там годами висят
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

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

Сообщение alexs »

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

Но я тоже больше склоняюсь к версии что сломали в FPC.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

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

Сообщение Снег Север »

Lazarus 2.0.4
Windows 10 x64

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

работает нормально - инсталируется и деинсталируется по ключам
только запускать и останавливать надо из управления сервисами
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

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

Сообщение alexs »

Снег Север
Проблема в обработке приостановки - продолжения
У меня тоже сервис устанавливается, стартует, останавливается и деирсталируется нормально.
А вот событие на паузу/продолжение - почемуто не работает.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

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

Сообщение Снег Север »

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;               
Vodnik
новенький
Сообщения: 45
Зарегистрирован: 24.12.2016 00:14:23

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

Сообщение Vodnik »

Чертовщина какая-то... Скачал файл 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 - везде поведение одинаковое!
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

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

Сообщение Снег Север »

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

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

Сообщение Vodnik »

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

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