Re[2]: GINA:пропадает Logon диалог
От: .Mistery Беларусь  
Дата: 11.05.04 12:16
Оценка:
Здравствуйте, Vladimir_the_Red_Sunny, Вы писали:

V__>Появляется диалог логона. Если не логиниться, и вообще его не трогать, то через две минуты он исчезает сам, а комп "зависает"? В этом проблема? А WlxDisplaySASNotice пустая у Вас?


Она не должна быть пустая, в ней как раз то и должен выводится диалог логина юзера. ТОлько нельзя забывать, что когда основной поток будет ползать по message loop диалога, вполне может возникнуть какой нибудь SAS и winlogon вызовет соответствующую ф-ю GINA в другом потоке. Это остается на контроле программиста, что делать в данном случае, я в таких случаях всегда возвращал WLX_SAS_ACTION_NONE, а весь контроль держал сам в диалоге.

V__>Если да, то у меня было что-то похожее. Проверял всевозможные утечки памяти и ресурсов, не обнаружил. Нашел следующее решение проблемы.


V__>Значит, комп если долго не трогать, он начинает засыпать. При засыпании он логоффится, блокируется, и еще там всякая фигня.Но в моей джине не работало путём: рабочий стол очищался, и так всё замирало. Я вёл debug-лог, там было видно, что в этом зависании фактически вызывается раз за разом WlxScreenSaverNotify,


Если в WlxScreenSaverNotify вернуть FALSE то никаких засыпаний не будет.

V__>и еще, кажется, какая-то функция, ответственная за вывод диалога с сообщением в этом случае.


WlxDisplayStatusMessage, возвращаем FALSE и winlogon знает что никаких messages небыло отображено.

V__>Щас не помню деталей, некоторое время не работал над этим проектом. Так вот, во все пустые функции WlxЧё-ТоТам, которые должны/могут отображать диалог с сообщением, я запихнул по диалогу, и проблема пропала.


Они не должны быть пустые, т.е. хотябы TRUE или FALSE они должны возвращать. И запихивать туда диалоги вовсе не обязательно.

V__>Как я понял (могу жестоко ошибаться), проблема была в том, что эти диалоги убиваются каким-то своим особым винлогоновским способом (то ли по SAS-event'у, то ли еще как), и одновременно с этим прекращается работа Wlx-функции, которая этот диалог отобразила.


Верно! Но это не проблема, а Winlogon так работает, он посылает диалогу, отображенному ф-ей GINA, сообщение WLX_WM_SAS.

MSDN:
Winlogon sends messages to the GINA while dialog boxes are displayed. These messages are all encapsulated 
in the WLX_WM_SAS message.

For time-outs and logoffs, Winlogon will end the dialog after the message has been sent. This message is sent so 
the dialog can respond in a useful manner (for example, by closing itself down if a logoff has occurred). For logoffs, 
the dialog is ended with the code WLX_DLG_USER_LOGOFF.


V__>Пока диалог (модальный!) существует, Wlx-функция работает. Пришел евент — умирает вместе с диалогом. Но если она (или диалог) закончили работу по каким-то другим причинам (напр. нажали ОК на диалоге, или вовсе его не создавали) — функция сразу же снова вызывается. Infinite loop. Отображением диалога я ее как бы "стопорил", чтобы вызывалась единожды.


Именно так оно и работает, это нужно самому контролировать.

V__>Не знаю, решение это проблемы, или кривой обход — но с виду вроде как помогло


Как я уже сказал можно просто возвращать везде FALSE и говорить о том что никаких display messages мы не отображаем и тогда вышеописанная проблема отпадает сама собой.

Удачи!
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.