Форум: "Система";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Внизпрограммирование сервиса для w2k Найти похожие ветки
← →
ScaliaR (2003-02-22 02:27) [0]Привет всем! В общем, проблема такая -
В Delphi 7 программирую сервис для 2k, создал Service Application
когда пытаюсь запустить из delphi, то он молча запускается,
проходит OnCreate, и ~ через 4 сек молча выходит без единого алерта, а в журнал приложений добавляется
"Не найдено описание для события с кодом ( 0 ) в источнике ( Project1.exe ). ... . В записи события содержится
следующая информация: Процесс службы не может установить связь с контроллером службы."
А если запускать этот сервис через консоль управления, то выдается
"ошибка 1053: Служба не ответила на запрос своевременно"
Как эту связь установить? и вообще что делать?
Delphi запускается под админом (ось - w2k server rus), сервис что зарегистрирован что незарегистрирован, все одно.
(а такой же проект в D5 вообще оставляет в журнале сообщение "класс не существует")
← →
Digitman (2003-02-22 14:39) [1]
> когда пытаюсь запустить из delphi, то он молча запускается,
>
это как ? запуск приложения по F9 ?
так дело не пойдет) ... это же не обычное приложение, а приложение-сервис ! И контроль за старт/стопом процесса этого приложения должен осуществлять сист.контроллер службы.
Иными словами, ты должен, постороив EXE-файл, зарегистрировать его в списке сервисов, запустить в ком.строке с ключем /INSTALL.
После этого твой сервис станет доступен для управления через консоль, и старт/стоп твоего сервиса можно будет осуществить, например. средствами той же консоли.
← →
ScaliaR (2003-02-23 03:53) [2]в том то и все дело, запускаю и регистрирую (/INSTALL) а потом лезу в управление сервисами и пытаюсь запустить его - получаю ошибка 1053: Служба не ответила на запрос своевременно
← →
Digitman (2003-02-25 09:22) [3]Значит, скорей всего, неверно/некорректно обрабатываешь события объекта TService.
← →
Lord Warlock (2003-02-25 09:50) [4]Обрабатываешь событие ServiceExecute?
← →
Serggio (2003-02-25 15:05) [5]Вообще, для корректной работы сервиса надо создать новый поток и в нем исполнять основное действие сервиса.
То есть:
TMyThread=class (TThread)
public
procedure Execute; override;
end;
//В TMyThread.execute вставляешь рабочий код
//В нем пиши (чтоб исполнялось периодически):
// if Terminated then exit;
TService1=class(TService)
...
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServicePause(Sender : TService; var Paused : Boolean);
Procedure ServiceContinue(Sender: TService;
var Continued: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
end;
MyThread:TMyThread;
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
MyThread := TMyThread.Create(True);
MyThread.Priority:=tpNormal;
MyThread.Resume;
Started := True;
end;
procedure TService1.ServicePause(Sender: TService; var Paused: Boolean);
begin
MyThread.Suspend;
Paused:=true;
end;
procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
MyThread.Terminate;
Stopped:=true;
end;
procedure TService1.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
MyThread.Resume;
Continued:=true;
end;
Короче суть в том, что ты помещаешь исполняемый код в TMyThread.Execute, то есть в отдельный поток, который запускается, останавливается из основоного. Таким образом? можно добиться реагирования на системные запросы. Главное не забудь постоянно опрашивать флаг terminated в методе Execute.
← →
Serggio (2003-02-25 15:06) [6]Вообще, для корректной работы сервиса надо создать новый поток и в нем исполнять основное действие сервиса.
То есть:
TMyThread=class (TThread)
public
procedure Execute; override;
end;
//В TMyThread.execute вставляешь рабочий код
//В нем пиши (чтоб исполнялось периодически):
// if Terminated then exit;
TService1=class(TService)
...
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServicePause(Sender : TService; var Paused : Boolean);
Procedure ServiceContinue(Sender: TService;
var Continued: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
end;
MyThread:TMyThread;
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
MyThread := TMyThread.Create(True);
MyThread.Priority:=tpNormal;
MyThread.Resume;
Started := True;
end;
procedure TService1.ServicePause(Sender: TService; var Paused: Boolean);
begin
MyThread.Suspend;
Paused:=true;
end;
procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
MyThread.Terminate;
Stopped:=true;
end;
procedure TService1.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
MyThread.Resume;
Continued:=true;
end;
Короче суть в том, что ты помещаешь исполняемый код в TMyThread.Execute, то есть в отдельный поток, который запускается, останавливается из основоного. Таким образом? можно добиться реагирования на системные запросы. Главное не забудь постоянно опрашивать флаг terminated в методе Execute.
← →
Александр Спелицин (2003-02-25 23:07) [7]Рихтер. Программирование сервеных приложений для Windows 2000.
← →
ScaliaR (2003-02-26 01:55) [8]спасибо всем! очень помогли.
2 Lord Warlock именно это то я и забыл сделать.
2 Serggio спасибо за код
← →
Digitman (2003-02-26 08:57) [9]
> Serggio
Совершенно необязательно создавать доп.код.поток.
Необходимо это только если сервис исполняет длительные по времени вычисления (и должен в ходе их немедленно реагировать на команды, посылаемые сервис-контроллером). Если же вычисления небольшие, то их вполне можно поместить непосредственно в обработчики событий OnStart, OnStop, OnExecute и т.д.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c