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

Вниз

Запуск Апплета через сервис   Найти похожие ветки 

 
Vladimyr ©   (2007-07-21 11:42) [0]

Всем привет, нужет совет по поводу того, как устроен Апплет.
Задача состоит в том, чтобы работающий сервис запускал Апплет каждый раз, когда юзер входит в сеанс Винды (logon).
И всё вроде бы хорошо работает, но только первый раз, т.е. при старте сервиса.
После операции logoff-logon сервис пытается запустить Апплет, но вылетает в момент выполнения "NewForm" (отладка данного момента, как вы понимаете, весьма проблематична).

В общих чертах устройство программы таково:
1. Сервис запускается и постоянно шуршит в фоне;
2. При запуске сервиса или отлове сообщения WM_TaskbarCreated запускается отдельный процесс, примерно устроенный так:

Applet := NewApplet ("zzz");
NewF1Form (F1Form, Pointer (Applet));  // Здесь вылет
Applet.AllBtnReturnClick;
Applet.Visible := false;
AppletRunning := true;
AppletTerminated := false;
run (Applet);


Если же не создавать форму вторично, то вылет происходит в момент обращения к компонентам формы (что логично, так как всё уничтожено во времы предыдущего logoff"а).

Как же мне добиться того, чтобы после logoff и последующего logon Апплет запустился во второй раз?!


 
Vladimir Kladov   (2007-07-22 19:59) [1]

Разве в сервисе нельзя отловить событие logoff/login?


 
Vladimyr ©   (2007-07-22 23:14) [2]

Разумеется, можно! С этим проблем нет.
> После операции logoff-logon сервис пытается запустить Апплет, но вылетает в момент выполнения "NewForm"


 
Дмитрий К ©   (2007-07-22 23:27) [3]


> но вылетает в момент выполнения "NewForm"

Ошибка в NewForm?


 
Vladimir Kladov   (2007-07-23 17:53) [4]

Наверное, надо ApletTerminated присвоить false.


 
Vladimyr ©   (2007-07-23 19:24) [5]

Владимир, я ценю Ваше желание помочь, но прочитайте, наконец, сам вопрос! :)

> AppletTerminated := false;

Дмитрий К, ошибки в NewForm нет, в первый раз все отлично запускается (см. 3-ю строку вопроса)

> всё вроде бы хорошо работает, но только первый раз

2all: правильно ли я поступаю в принципе, запуская Апплет таким образом?


 
Vladimir Kladov   (2007-07-23 20:01) [6]

Буквы мелкие, не узрил. А как он убивается, сам? Посмотрите на демо с вызовом формы KOL из приложения VCL, принцип примерно должен быть тот же. Там Applet еще и убивается.


 
Vladimyr ©   (2007-07-23 21:01) [7]

Владимир, Вы имеете в виду "Пример вызова модальной формы MCK из проекта VCL"?

Изучил. Обнаружил следующие отличия:

там - NewForm1 (Form1, Applet),
у меня - NewForm1 (Form1, Pointer (Applet))
Вроде никакой разницы.
Т.е. в первый раз всё запускается, при логоффе Апплет завершает работу, при следующем логоне смотришь - сервис остановлен. Если не делать NewForm, то сервис продолжает работать, но как тогда работать с формой?!

Остались вопросы:

1. Нужно ли руками убивать Апплет про логоффе и воссоздавать при логоне?
Или же он переживёт логофф и всё будет ок?

2. Переживёт ли логофф форма?

3. Как же надо запускать Апплет после логоффа, чтобы он запустился? (будь он неладен)


 
Vladimir Kladov   (2007-07-23 21:40) [8]

В конце же написано:

 Applet.Free;
 Applet := nil;

 AppletTerminated := FALSE;


Не зря ведь написано. попробовать - что мешает?


 
Vladimyr ©   (2007-07-23 22:24) [9]

Владимир, о чём Вы?!
Во всём проекте DemoModalVcl2kolDll нет ни одного упоминания "AppletTerminated"! Или я не туда смотрю?

Попробовал вставить эти строки после выполнения логофф.
Поведение программы не изменилось.

Ладно, сейчас сварганю тестовый проект с голой формой, буду экспериментировать...


 
Vladimyr ©   (2007-07-23 22:46) [10]

Вот это фокус!!!

Начал втыкать в NewForm ("Project1_1.inc") оператор beep (1000, 400), чтобы определить, в каком месте происходит вылет (изврат, но ничего лучше не придумал :)
И вот... при очередном втыкании (как раз перед присваиванием значений обработчикам OnMessage и т.п.) ... всё заработало!!!  %-]

То есть: втыкаю биип - Апплет нормально запускается после логоффа сколько хочешь. Убираю биип - сервис вылетает. МИСТИКА!!!


 
GMax   (2007-07-23 23:06) [11]

в порядке эксперимента - sleep(xx) не поможет ли ?


 
Vladimir Kladov   (2007-07-24 15:42) [12]

DemoVCL2KOLDll.zip я его правил недавно, там точно было.


 
Vladimyr ©   (2007-07-24 20:21) [13]

2 GMax: Как ни странно, нет. Да и beep помогает через раз :(

2 Vladimir: Скачал, проверил. Ни на что не влияет :(


 
Vladimir Kladov   (2007-07-24 21:07) [14]

Значит, не надо в ответ на то сообщение, которое вы ловите. Видимо, в этот момент ещё рано. Поищите более позднее событие. Может быть, стоит по таймеру поотлавливать наличие определённого окна. (Я вообще подозреваю, что облом из-за того, что ещё не создано окно рабочего стола, и Applet соответственно не может ни к чему природниться. Хотя это только мои домыслы).


 
Vladimir Kladov   (2007-07-24 21:09) [15]

и насчёт "таймера" - это я тоже не совсем про таймер. В общем в том месте, где регулярно приходят сообщения, проверяя к примеру, чтобы после последней проверки прошло больше скажем 10 мс, выполнять проверку, если еще не создан.



Страницы: 1 вся ветка

Текущий архив: 2008.03.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
4-1184247411
GTR86
2007-07-12 17:36
2008.03.09
Номер винчестера


15-1202110849
ПЛОВ
2008-02-04 10:40
2008.03.09
Существует ли в природе такое МФУ?


2-1202803897
abhtr
2008-02-12 11:11
2008.03.09
2 TMainMenu на одной форме?


2-1202578462
DDR
2008-02-09 20:34
2008.03.09
Поиск файлов и TreeView


15-1202060677
Kostafey
2008-02-03 20:44
2008.03.09
С днем рождения ! 3 февраля