Всем здравствовать.
Lazarus 1.8.0
Разбираюсь с созданием службы для windows
по статье http://www.freepascal.ru/article/lazaru ... 403120204/
В целом работает, создал и запустил службу которая открывает при старте файл на диске и пишет туда ДатуВремя раз в 10 секунд по таймеру.
Сложности начались при попытке подключиться к MS SQL Server
Закомментил весь код почти и определил в чем проблема, опишу только финальную точку на которой видно проблему.
1. у daemonunit есть дата модуль назвал его DM и накидал туда компонент
т.е. получается так
type TDM = class(TDaemon)
MSSQLServ: TMSSQLConnection;
Select: TSQLQuery;
SQLTrans: TSQLTransaction;
Timer1: TTimer;
var DM: TDM;
2. Если в daemon_unit я пишу MSSQLServ.HostName:='127.0.0.1'; то скомпилированная служба запускается и работает
3. Если я выношу MSSQLServ.HostName:='127.0.0.1'; в другой модуль sql_unit где пишу daemon_unit.DM.MSSQLServ.HostName:='127.0.0.1'; или DM.MSSQLServ.HostName:='127.0.0.1';
то служба при попытке запуска долго думает и вылетает с ошибкой, о том что во время не ответила.
в uses оба модуля друг другу прописаны.
При этом, когда я тестировал запись в файл то пользовался процедурами из другого модуля writelog_unit и это работало, но в случае с компонентой расположенной в ДатаМодуле "демона" это приводит к ошибке.
Получается что к компонентам из разных модулей в случае служб нельзя обращаться?
Служба, подключение к SQL Server
Модератор: Модераторы
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Думаю дело не службе/MSSQL и т.д. Вопрос в очередности вызова модулей. Просто подключение где-то происходит до того, как серверу прописывается HostName
Ichthyander писал(а):Думаю дело не службе/MSSQL и т.д. Вопрос в очередности вызова модулей. Просто подключение где-то происходит до того, как серверу прописывается HostName
Нет никакого подключения. Проверил, в компонентах адреса пустые и не стоит галка connected
P.S. Да и не понятно как может сработать ваше предположение.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Я делал службы (но без DataModule), так вот служба запускается в отдельном потоке, отличном от потока самой программы. Возможно в этом деле. Все переменные, которые могут меняться заключаю в критические секции, либо читаются в событии OnStart, onStop, либо переменные, которые не могут менятся другими потоками в этот момент. Может это поможет в локализации Вашей проблемы
Сделал создание компоненты динамически, в том же модуле откуда обращался к DM, работает.
jsa писал(а):Получается что к компонентам из разных модулей в случае служб нельзя обращаться?
Все ваши проблемы из-за Application.
Добавлено спустя 3 минуты 40 секунд:
в этом модуле устанавливается и запускается главный поток.
Вне его - сами пишите потоко-безопасный код, с вызовами WinAPI Базовая служба Windows в C++
