![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск Апплета через сервис [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?