| 
| 
 | Вопрос # 2 179/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Может быть кто-нибудь подскажет, почему сервис после запуска сразу останавливается и выходит сообщение "Служба <ServicesName> на <Локальный компьютер> была запущена и затем остановлена. Некоторые службы автоматически останавливаются, если им нечего делать."
 
 Такая проблема возникает, когда я вызываю в событии OnExecute компонента TServices создание своего потока.
 
 Пустой сервис выполняется нормально. (это к тому ,что сам сервис создан вроде правильно).
 Приложение:Переключить в обычный режим  procedure Start();var tmp:TWorkTread;    ThreadList:TList;    ADOCon:TADOConnection;    Clients:TADOStoredProc;    i:integer;    _SrcAddr,_HttpAddr:string;begin   ADOCon:=TADOConnection.Create(nil);ADOCon.ConnectionString:=SQL_CONNECTION_STRING;try  if ADOCon.Connected=false then    ADOCon.Open;except end; Clients:=TADOStoredProc.Create(nil);Clients.Connection:=ADOCon;Clients.ProcedureName:='sms2httpSelectClients;1';Clients.Active:=True;i:=0;Clients.First;while not Clients.Eof do  begin  _SrcAddr:=trim(Clients.Fields.Fields[0].Value);  _HttpAddr:=trim(Clients.Fields.Fields[1].Value);  try    ThreadList.Add(TWorkTread.Create(i,_SrcAddr,_HttpAddr));  except   end;  i:=i+1;  Clients.Next;  end; end; 
|  |   Вопрос задал: 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 (статус: Посетитель), 9 декабря 2008, 21:40 [#1]:Да,кстати, весь код, сделанный не ввиде службы ,а в win32 приложении работает нормально |  
|   | HotMan (статус: Посетитель), 9 декабря 2008, 22:04 [#2]:вот что пишет EventLog: Не найдено описание для события с кодом ( 0 ) в источнике ( Service1 ). Возможно, на локальном компьютере нет нужных данных в реестре или файлов DLL сообщений для отображения сообщений удаленного компьютера. Попробуйте использовать ключ /AUXSOURCE= для получения этого описания, - дополнительные сведения об этом содержатся в справке. В записи события содержится следующая информация: Service failed on execute: Не был произведен вызов CoInitialize.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |