Здравствуйте, 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 >>