Служба, подключение к SQL Server

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

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

Ответить
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Служба, подключение к SQL Server

Сообщение jsa »

Всем здравствовать.
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 и это работало, но в случае с компонентой расположенной в ДатаМодуле "демона" это приводит к ошибке.

Получается что к компонентам из разных модулей в случае служб нельзя обращаться?
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Думаю дело не службе/MSSQL и т.д. Вопрос в очередности вызова модулей. Просто подключение где-то происходит до того, как серверу прописывается HostName
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

Ichthyander писал(а):Думаю дело не службе/MSSQL и т.д. Вопрос в очередности вызова модулей. Просто подключение где-то происходит до того, как серверу прописывается HostName

Нет никакого подключения. Проверил, в компонентах адреса пустые и не стоит галка connected

P.S. Да и не понятно как может сработать ваше предположение.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Я делал службы (но без DataModule), так вот служба запускается в отдельном потоке, отличном от потока самой программы. Возможно в этом деле. Все переменные, которые могут меняться заключаю в критические секции, либо читаются в событии OnStart, onStop, либо переменные, которые не могут менятся другими потоками в этот момент. Может это поможет в локализации Вашей проблемы
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

Сделал создание компоненты динамически, в том же модуле откуда обращался к DM, работает.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

jsa писал(а):Получается что к компонентам из разных модулей в случае служб нельзя обращаться?

Все ваши проблемы из-за Application.

Добавлено спустя 3 минуты 40 секунд:
в этом модуле устанавливается и запускается главный поток.
Вне его - сами пишите потоко-безопасный код, с вызовами WinAPI Базовая служба Windows в C++
Ответить