Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

С завершением сервиса беда:(


TALLA ©   (2003-07-16 00:18:00) 

С завершением сервиса беда:(
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
Form2.Show;
end;

procedure TService1.ServiceExecute(Sender: TService);
begin
while not Terminated do begin
sleep(50);
ServiceThread.ProcessRequests(true);
end;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
Form2.Close;
end;

Форма не реагирует на свою кнопку закрытия (не отвечает).
При остановке сервиса вручную - Access Violation (с попыткой закрытия и без).

Не подскажете, где бы про сервисы под winXP почитать?
и желательно бы наглядный пример, взаимодействующий с экраном.


Digitman   (2003-09-08 12:59:00) [1]


> clickmaker


почему-почему)..

потому что НЕпеределанный модуль svsmgr.pas создает объекты класса именно TServiceThread ! А не его наследники)..


clickmaker   (2003-09-08 12:37:00) [2]

Digitman © (17.07.03 08:18) [6]

> clickmaker © (16.07.03 17:14)

без переделки svsmgr.pas не получится.
ведь в нем создается экз-р именно TServiceThread, и ни о каких TCrackedThread этому модулю неизвестно.
первая же попытка выполнить приведение TCrackedThread(ServiceThread) вызовет исключение, ибо сервис-тред не имеет класс TCrackedThread


Так это же стандартный прием для кряка protected-методов. По крайней мере, с другими классами он работает. Почему же с этим не будет?


User81   (2003-09-08 12:29:00) [3]

для NT работает такой способ
На пример сервис называется MYSERVISE
то выполнить код
winexec ("net stop "MYSERVISE"",0);


Digitman   (2003-07-17 08:18:00) [4]


> clickmaker © (16.07.03 17:14)


без переделки svsmgr.pas не получится.
ведь в нем создается экз-р именно TServiceThread, и ни о каких TCrackedThread этому модулю неизвестно.
первая же попытка выполнить приведение TCrackedThread(ServiceThread) вызовет исключение, ибо сервис-тред не имеет класс TCrackedThread


clickmaker   (2003-07-16 17:14:00) [5]

беда в том что (по кр.мере - в D5) стандартный метод TThread.synchronize(VCLobject.method) является protected

а ежели так

TCrackedThread = class(TServiceThread);

TCrackedThread(ServiceThread).Synchronize


Digitman   (2003-07-16 12:31:00) [6]


> TALLA

в форме ничего менять не нужно.
следует как-то синхронизировать обращения к методам/св-вам формы с осн.потоком сервис-процесса

беда в том что (по кр.мере - в D5) стандартный метод TThread.synchronize(VCLobject.method) является protected, и обратиться к нему иначе как из наследника TServiceThread не получится. А это означает, что выходов из ситуации как минимум два :
- декларировать и реализовать собственного наследника TServiceThread; это повлечет за собой изменение ориг.кода в модуле svcmgr.pas и его перекомпиляция (либо использование вместо svcmgr собственной ее копии с необходимыми доработками в части изменения всех обращений к стандартному TServiceThread на обращения к его наследнику);
- реализовать синхронизацию иными средствами; не лучший, но допустимый вариант - в событиях ServiceStart()/ServiceStop() создавать/уничтожать свой собственный thread, в контексте которого можно будет создать/уничтожить форму и обращаться к ее методам/св-вам с использованием доступного в этом случае метода synchronize()


TALLA   (2003-07-16 12:06:00) [7]

@Lord Warlock:
Не помогло
@Digitman:
А что конкретно изменить в коде для формы и сервиса?


Digitman   (2003-07-16 10:30:00) [8]

поскольку тред сервиса является дополнительным, а форма - непотокобезопасный визуальный контрол, то программные обращения к форме должны быть синхронизированы с осн.тредом приложения-сервиса.


Lord Warlock   (2003-07-16 08:10:00) [9]

Может это не поможет, но пропробуй

ServiceThread.ProcessRequests(false);


Наверх

Титульная страница Поиск, карта сайта Написать письмо