|
Вопрос # 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.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|