Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
8-54761
Pat
2003-01-08 02:50
2003.04.17
MediaPlayer


4-54938
AmericanSpy
2003-02-17 16:48
2003.04.17
ShellExecute в W2K


3-54506
Гость
2003-03-30 23:18
2003.04.17
QReport - кто хорошо разбирается?


6-54780
xarox
2003-02-25 21:44
2003.04.17
Что означают ошибки 10061 и 10057 в idsmtp???????


1-54576
саша
2003-04-07 07:05
2003.04.17
Функция переносящая курсор в тестовом файле.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский