Создание сервиса Windows
Модератор: Модераторы
Создание сервиса Windows
Всем привет,
Вроде всё описано в 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?
Вроде всё описано в 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
А какая ошибка? Должно работать.
Re: Создание сервиса Windows
Ну например при остановке сервиса из примера 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 задано.
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
Так надо обработать соответсвующие события:
Вот кусок из моего проекта:
Добавлено спустя 1 минуту 45 секунд:
Правда сейчас он работает в линухе - но начинал я его писать ещё в винде. Так что - кросплатформено.
Вот кусок из моего проекта:
Код: Выделить всё
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 секунд:
Правда сейчас он работает в линухе - но начинал я его писать ещё в винде. Так что - кросплатформено.
Re: Создание сервиса Windows
Конечно, обработчики есть! Это работавшие ранее примеры.
Судя по англоязычному форуму, LazDaemon когда-то успешно работал, а где-то в 2011-2014 начались проблемы. Ни одного решения я не нашёл. Под линуксом вроде всё ОК.
Вы не пробовали свой проект откомпилировать транковым Лазарусом и запустить под Виндой?
Судя по англоязычному форуму, LazDaemon когда-то успешно работал, а где-то в 2011-2014 начались проблемы. Ни одного решения я не нашёл. Под линуксом вроде всё ОК.
Вы не пробовали свой проект откомпилировать транковым Лазарусом и запустить под Виндой?
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Re: Создание сервиса Windows
Вот как раз в линух я переехал в 2014 году с ним 
Попробую
Попробую
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Re: Создание сервиса Windows
Дествительно - в винде7 есть такой глюк
Сам сервис работает. Но не воспринимает управляющие команды.
Мне интересно - а в XP/Win2003 -тоже не будет работать?
т.е. это в FPC сломали или не совместимость версий ОС?
Сам сервис работает. Но не воспринимает управляющие команды.
Мне интересно - а в XP/Win2003 -тоже не будет работать?
т.е. это в FPC сломали или не совместимость версий ОС?
Re: Создание сервиса Windows
Мне и сам сервис заставить работать не удалось.
Поищу комп с XP, проверю на серверах.
Только... что дальше-то?
Ну напишу я bug report, они там годами висят
Поищу комп с XP, проверю на серверах.
Только... что дальше-то?
Ну напишу я bug report, они там годами висят
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Re: Создание сервиса Windows
на XP/2003 точно всё работало
Т.е. если не заработает - можно просто попытаться найти ревизию - в которой сломали. Не так уж много там правок было.
Если заработает - надо читать доки по винде - в чём не совместимость между версиями.
Но я тоже больше склоняюсь к версии что сломали в FPC.
Т.е. если не заработает - можно просто попытаться найти ревизию - в которой сломали. Не так уж много там правок было.
Если заработает - надо читать доки по винде - в чём не совместимость между версиями.
Но я тоже больше склоняюсь к версии что сломали в FPC.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Re: Создание сервиса Windows
Lazarus 2.0.4
Windows 10 x64
Сделал пример отсюда:
https://devlaz.ru/daemons-in-lazarus/
работает нормально - инсталируется и деинсталируется по ключам
только запускать и останавливать надо из управления сервисами
Windows 10 x64
Сделал пример отсюда:
https://devlaz.ru/daemons-in-lazarus/
работает нормально - инсталируется и деинсталируется по ключам
только запускать и останавливать надо из управления сервисами
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Re: Создание сервиса Windows
Снег Север
Проблема в обработке приостановки - продолжения
У меня тоже сервис устанавливается, стартует, останавливается и деирсталируется нормально.
А вот событие на паузу/продолжение - почемуто не работает.
Проблема в обработке приостановки - продолжения
У меня тоже сервис устанавливается, стартует, останавливается и деирсталируется нормально.
А вот событие на паузу/продолжение - почемуто не работает.
- Снег Север
- долгожитель
- Сообщения: 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;
Re: Создание сервиса Windows
Чертовщина какая-то... Скачал файл 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 - везде поведение одинаковое!
"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 и вписывал в него код из статьи сам. Может быть дело именно в этом. Кстати, у меня лазарь стабильный, не транковый.
Re: Создание сервиса Windows
Заработало!!!
Добавил события OnPause и OnContinue, как предложил Снег Север, скомпилировал в Lazarus 2.0.4 - теперь и сервис работает (пишет в файл, правда, не непрерывно, а пачками по 36 сообщений), и все события отрабатывает без ошибок.
Честно говоря, не уловил, в чём секрет.
Может, обработчики событий OnPause и OnContinue для сервиса Windows - обязательные?..
Заметил, что пример Devlaz в отличие от Cleandirs в обработчиках не возвращает значение переменной ОК.
Добавлено спустя 19 минут 50 секунд:
Нет, удалил обработчики OnPause и OnContinue - всё равно работает, причём выполняет пункты меню Windows Services паузы и возобновления.
В общем, непонятно как, но проблема решена.
Спасибо, alexs и Снег Север!
Добавил события OnPause и OnContinue, как предложил Снег Север, скомпилировал в Lazarus 2.0.4 - теперь и сервис работает (пишет в файл, правда, не непрерывно, а пачками по 36 сообщений), и все события отрабатывает без ошибок.
Честно говоря, не уловил, в чём секрет.
Может, обработчики событий OnPause и OnContinue для сервиса Windows - обязательные?..
Заметил, что пример Devlaz в отличие от Cleandirs в обработчиках не возвращает значение переменной ОК.
Добавлено спустя 19 минут 50 секунд:
Нет, удалил обработчики OnPause и OnContinue - всё равно работает, причём выполняет пункты меню Windows Services паузы и возобновления.
В общем, непонятно как, но проблема решена.
Спасибо, alexs и Снег Север!
