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

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

Запуск Апплета через сервис [Delphi, Windows]


Vladimyr ©   (2007-07-21 11:42:00) 

Всем привет, нужет совет по поводу того, как устроен Апплет.
Задача состоит в том, чтобы работающий сервис запускал Апплет каждый раз, когда юзер входит в сеанс Винды (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-24 21:09:00) [1]

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


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

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


Vladimyr   (2007-07-24 20:21:00) [3]

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

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


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

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


GMax   (2007-07-23 23:06:00) [5]

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


Vladimyr   (2007-07-23 22:46:00) [6]

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

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

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


Vladimyr   (2007-07-23 22:24:00) [7]

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

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

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


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

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

 Applet.Free;
 Applet := nil;

 AppletTerminated := FALSE;


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


Vladimyr   (2007-07-23 21:01:00) [9]

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

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

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

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

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

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

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


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

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


Vladimyr   (2007-07-23 19:24:00) [11]

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

> AppletTerminated := false;

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

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

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


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

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


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


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

Ошибка в NewForm?


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

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


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

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


Наверх

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