Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.17;
Скачать: CL | DM;

Вниз

программирование сервиса для 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
3-54421
Afteam
2003-04-01 10:51
2003.04.17
Есть компоненты для работы с DBase в многопользовательском режиме


3-54436
Pat
2003-04-01 14:16
2003.04.17
Подключение к запароленной БД


7-54924
Colt
2003-02-25 09:14
2003.04.17
Рисование текста на экране


3-54398
me2
2003-04-01 10:29
2003.04.17
Создание, удаление и просмотр пользователей


7-54904
Gero-man
2003-02-23 12:17
2003.04.17
Отлов обращений к файлу