Главная страница
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
8-54750
vvvaaa
2003-01-17 13:43
2003.04.17
Градиент


1-54734
Димка_чайник
2003-04-05 22:07
2003.04.17
Как сделать чтобы FORM1 была всегда поверх других окон?


1-54603
_User_
2003-04-07 17:12
2003.04.17
Выгрузка приложения


6-54772
Stanislav SM
2003-02-23 00:14
2003.04.17
Передача сообщений по локальной сети


1-54675
Димон1
2003-04-04 15:59
2003.04.17
нужен chr наоборот