Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 179

/ вопрос открыт /

Здравствуйте, эксперты!
Может быть кто-нибудь подскажет, почему сервис после запуска сразу останавливается и выходит сообщение "Служба <ServicesName> на <Локальный компьютер> была запущена и затем остановлена. Некоторые службы автоматически останавливаются, если им нечего делать."

Такая проблема возникает, когда я вызываю в событии OnExecute компонента TServices создание своего потока.

Пустой сервис выполняется нормально. (это к тому ,что сам сервис создан вроде правильно).

Приложение:
  1.  
  2. procedure Start();
  3. var tmp:TWorkTread;
  4. ThreadList:TList;
  5. ADOCon:TADOConnection;
  6. Clients:TADOStoredProc;
  7. i:integer;
  8. _SrcAddr,_HttpAddr:string;
  9. begin
  10.  
  11.  
  12.  
  13. ADOCon:=TADOConnection.Create(nil);
  14. ADOCon.ConnectionString:=SQL_CONNECTION_STRING;
  15. try
  16. if ADOCon.Connected=false then
  17. ADOCon.Open;
  18. except
  19.  
  20. end;
  21.  
  22. Clients:=TADOStoredProc.Create(nil);
  23. Clients.Connection:=ADOCon;
  24. Clients.ProcedureName:='sms2httpSelectClients;1';
  25. Clients.Active:=True;
  26. i:=0;
  27. Clients.First;
  28. while not Clients.Eof do
  29. begin
  30. _SrcAddr:=trim(Clients.Fields.Fields[0].Value);
  31. _HttpAddr:=trim(Clients.Fields.Fields[1].Value);
  32. try
  33. ThreadList.Add(TWorkTread.Create(i,_SrcAddr,_HttpAddr));
  34. except
  35.  
  36. end;
  37. i:=i+1;
  38. Clients.Next;
  39. end;
  40.  
  41. end;
  42.  


HotMan Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: HotMan (статус: Посетитель)
Вопрос отправлен: 9 декабря 2008, 21:10
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, HotMan!
Так Вам же все рассказало. даже носом ткнуло:) Дело в том, что делфи любит "делать хорошо". И к этому привыкаешь. В частности в обычных программах она за Вас инициализирует подсистему OLE/COM. В потоках/службах - будьте добры, сами, ручками. Но дело не сложное - надо всего одну строку вставить + накладные расходы. Итого, в юниты, где есть поток надо вставить такой код

uses
  ActiveX, // <-- Этот юнит надо включить обязательно
  Windows; // ну и другие Ваши модули
 
 
initialization
  CoInitialize(nil); // <-- вызываем CoInitialize()
 
finalization
  CoUnInitialize; // <-- Для освобожнедия памяти
 
end.
Если это не заработает, тогда надо вставить вызов CoInitialize в начало процедуры Execute потока. ну и CoUnInitialize в конец.
Сразу предупрежу о возможных дополнительных глюках. Сервис запускается от отдельного пользователя, не от Вашего, а от системного. И обычно, если ничено не предпренять, то к примеру у него не будет доступа к локальной сети.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 10 декабря 2008, 03:26
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 9 декабря 2008, 22:04; участников в обсуждении: 1.
HotMan

HotMan (статус: Посетитель), 9 декабря 2008, 21:40 [#1]:

Да,кстати, весь код, сделанный не ввиде службы ,а в win32 приложении работает нормально
HotMan

HotMan (статус: Посетитель), 9 декабря 2008, 22:04 [#2]:

вот что пишет EventLog:
Не найдено описание для события с кодом ( 0 ) в источнике ( Service1 ). Возможно, на локальном компьютере нет нужных данных в реестре или файлов DLL сообщений для отображения сообщений удаленного компьютера. Попробуйте использовать ключ /AUXSOURCE= для получения этого описания, - дополнительные сведения об этом содержатся в справке. В записи события содержится следующая информация: Service failed on execute: Не был произведен вызов CoInitialize.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.02 сек.