Текущий архив: 2003.11.17;
Скачать: CL | DM;
ВнизС завершением сервиса беда:( Найти похожие ветки
← →
TALLA (2003-07-16 00:18) [0]С завершением сервиса беда:(
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 почитать?
и желательно бы наглядный пример, взаимодействующий с экраном.
← →
Lord Warlock (2003-07-16 08:10) [1]Может это не поможет, но пропробуй
ServiceThread.ProcessRequests(false);
← →
Digitman (2003-07-16 10:30) [2]поскольку тред сервиса является дополнительным, а форма - непотокобезопасный визуальный контрол, то программные обращения к форме должны быть синхронизированы с осн.тредом приложения-сервиса.
← →
TALLA (2003-07-16 12:06) [3]@Lord Warlock:
Не помогло
@Digitman:
А что конкретно изменить в коде для формы и сервиса?
← →
Digitman (2003-07-16 12:31) [4]
> TALLA
в форме ничего менять не нужно.
следует как-то синхронизировать обращения к методам/св-вам формы с осн.потоком сервис-процесса
беда в том что (по кр.мере - в D5) стандартный метод TThread.synchronize(VCLobject.method) является protected, и обратиться к нему иначе как из наследника TServiceThread не получится. А это означает, что выходов из ситуации как минимум два :
- декларировать и реализовать собственного наследника TServiceThread; это повлечет за собой изменение ориг.кода в модуле svcmgr.pas и его перекомпиляция (либо использование вместо svcmgr собственной ее копии с необходимыми доработками в части изменения всех обращений к стандартному TServiceThread на обращения к его наследнику);
- реализовать синхронизацию иными средствами; не лучший, но допустимый вариант - в событиях ServiceStart()/ServiceStop() создавать/уничтожать свой собственный thread, в контексте которого можно будет создать/уничтожить форму и обращаться к ее методам/св-вам с использованием доступного в этом случае метода synchronize()
← →
clickmaker (2003-07-16 17:14) [5]беда в том что (по кр.мере - в D5) стандартный метод TThread.synchronize(VCLobject.method) является protected
а ежели так
TCrackedThread = class(TServiceThread);
TCrackedThread(ServiceThread).Synchronize
← →
Digitman (2003-07-17 08:18) [6]
> clickmaker © (16.07.03 17:14)
без переделки svsmgr.pas не получится.
ведь в нем создается экз-р именно TServiceThread, и ни о каких TCrackedThread этому модулю неизвестно.
первая же попытка выполнить приведение TCrackedThread(ServiceThread) вызовет исключение, ибо сервис-тред не имеет класс TCrackedThread
← →
User81 (2003-09-08 12:29) [7]для NT работает такой способ
На пример сервис называется MYSERVISE
то выполнить код
winexec ("net stop "MYSERVISE"",0);
← →
clickmaker (2003-09-08 12:37) [8]Digitman © (17.07.03 08:18) [6]
> clickmaker © (16.07.03 17:14)
без переделки svsmgr.pas не получится.
ведь в нем создается экз-р именно TServiceThread, и ни о каких TCrackedThread этому модулю неизвестно.
первая же попытка выполнить приведение TCrackedThread(ServiceThread) вызовет исключение, ибо сервис-тред не имеет класс TCrackedThread
Так это же стандартный прием для кряка protected-методов. По крайней мере, с другими классами он работает. Почему же с этим не будет?
← →
Digitman (2003-09-08 12:59) [9]
> clickmaker
почему-почему)..
потому что НЕпеределанный модуль svsmgr.pas создает объекты класса именно TServiceThread ! А не его наследники)..
Страницы: 1 вся ветка
Текущий архив: 2003.11.17;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.01 c