Пишу свою GINу. Появилась проблема: призагрузке системы появлется логон диалог.
Если не чего не далеть, то примерно через 2 минуты он проподает. система не на что не реагирует.
Такая же проблема в примере GINA от майкрософта.
трассировка показала следущее:
Здравствуйте, Toughpheeckouse, Вы писали:
T>Привет!
T>Пишу свою GINу. Появилась проблема: призагрузке системы появлется логон диалог. T>Если не чего не далеть, то примерно через 2 минуты он проподает. система не на что не реагирует. T>Такая же проблема в примере GINA от майкрософта.
T>кто вызвал WlxLogoff, и зачем?
T>подумал сначала, что это Screen Saver так действует. отключение не помогло.
T>OS: WinXP pro sp1
T>Что за беда такая?
У меня была такая же фигня. Оказалось просто, что GDI объект один не освобождался, т.е. в message loop диалога работал CreateFont и создавал обьект Font, ну вот как только я стал его освобождать после использования — все стало ОК.
Так, что первое что стоит посмотреть это memory leaks!
M>У меня была такая же фигня. Оказалось просто, что GDI объект один не освобождался, т.е. в message loop диалога работал CreateFont и создавал обьект Font, ну вот как только я стал его освобождать после использования — все стало ОК.
M>Так, что первое что стоит посмотреть это memory leaks!
M>Удачи!
У меня нет утечек GDI объектов.
Причем, как я уже писал, пример GINы от майкрософта, имеет такой же эффект.
так и не могу понять в чем дело.
Здравствуйте, Toughpheeckouse, Вы писали:
T>У меня нет утечек GDI объектов. T>Причем, как я уже писал, пример GINы от майкрософта, имеет такой же эффект.
Примеры от Microsoft это конечно показатель, но я не первый раз встречаюсь с тем, что даже Microsoft примеры работают с глюками, это впринципе нормально когда пишутся довольно сложные вещи, ведь Microsoft не использует всякие там BoundCheckers, Compuware DevPartner Studio и так далее, ранг так сказать не позволяет пользоваться программами сторонних производителей Ну ладно, это так лирическое отступление.
T>так и не могу понять в чем дело.
Еще сталкивался с таким багом, что на моей машине не работает, а на виртуалке работает. И соответственно пробовал на нормальной машине с чистой виндой, тоже все Ок (это все про тоже пропадание диалогов). Черт его знает настройки может какие влияют или еще что — не научный конечно ответ для программиста , но я так и неразобрался в чем было дело.
Ок, ну я бы в такой ситуации поступил так: Создал бы простой диалог с двумя кнопками и пустой message loop (ну в смысле с обработкой всех необходимых событий ), ну типа такого (это я выдрал кусок из своей GINA, с кое какими сокращениями для облегчения чтения кода):
Ну и посмотреть как поведет себя такой код, я думаю что все будет Ок и ничего пропадать не станет. Если так значит всетаки какие то проблемы у тебя в message loop диалога, а вот если нет тогда нужно ловить ту тварь которая посылает SAS винлогону. Это вероятно самый не простой способ узнать кто портит погоду, нужно перехватывать вызов API функции ExitWindow с флагом EX_LOGOFF и потом посмотреть какой процесс это делает, может это сможет навести на какие нибудь мысли.
Если уж сильно нужно будет, для чистоты эксперемента, могу выслать тебе свою GINA, запустишь ее и посмотрим будет у меня диалог пропадать или нет!
Здравствуйте, Toughpheeckouse, Вы писали:
T>Привет!
T>Пишу свою GINу. Появилась проблема: призагрузке системы появлется логон диалог. T>Если не чего не далеть, то примерно через 2 минуты он проподает. система не на что не реагирует. T>Такая же проблема в примере GINA от майкрософта. T>трассировка показала следущее:
T>
T>кто вызвал WlxLogoff, и зачем?
T>подумал сначала, что это Screen Saver так действует. отключение не помогло.
T>OS: WinXP pro sp1
T>Что за беда такая?
Появляется диалог логона. Если не логиниться, и вообще его не трогать, то через две минуты он исчезает сам, а комп "зависает"? В этом проблема? А WlxDisplaySASNotice пустая у Вас?
Если да, то у меня было что-то похожее. Проверял всевозможные утечки памяти и ресурсов, не обнаружил. Нашел следующее решение проблемы.
Значит, комп если долго не трогать, он начинает засыпать. При засыпании он логоффится, блокируется, и еще там всякая фигня. Но в моей джине не работало путём: рабочий стол очищался, и так всё замирало. Я вёл debug-лог, там было видно, что в этом зависании фактически вызывается раз за разом WlxScreenSaverNotify, и еще, кажется, какая-то функция, ответственная за вывод диалога с сообщением в этом случае. Щас не помню деталей, некоторое время не работал над этим проектом. Так вот, во все пустые функции WlxЧё-ТоТам, которые должны/могут отображать диалог с сообщением, я запихнул по диалогу, и проблема пропала. Как я понял (могу жестоко ошибаться), проблема была в том, что эти диалоги убиваются каким-то своим особым винлогоновским способом (то ли по SAS-event'у, то ли еще как), и одновременно с этим прекращается работа Wlx-функции, которая этот диалог отобразила. Пока диалог (модальный!) существует, Wlx-функция работает. Пришел евент — умирает вместе с диалогом. Но если она (или диалог) закончили работу по каким-то другим причинам (напр. нажали ОК на диалоге, или вовсе его не создавали) — функция сразу же снова вызывается. Infinite loop. Отображением диалога я ее как бы "стопорил", чтобы вызывалась единожды.
Не знаю, решение это проблемы, или кривой обход — но с виду вроде как помогло
M>Еще сталкивался с таким багом, что на моей машине не работает, а на виртуалке работает. И соответственно пробовал на нормальной машине с чистой виндой, тоже все Ок (это все про тоже пропадание диалогов). Черт его знает настройки может какие влияют или еще что — не научный конечно ответ для программиста , но я так и неразобрался в чем было дело.
M>Ок, ну я бы в такой ситуации поступил так: Создал бы простой диалог с двумя кнопками и пустой message loop (ну в смысле с обработкой всех необходимых событий ), ну типа такого (это я выдрал кусок из своей GINA, с кое какими сокращениями для облегчения чтения кода):
да у меня в принцепе то так и есть, только не чистый Win API, а ATL к этому прикручен.
V__>Появляется диалог логона. Если не логиниться, и вообще его не трогать, то через две минуты он исчезает сам, а комп "зависает"? В этом проблема? А WlxDisplaySASNotice пустая у Вас?
ты это, хорош тут на Вы! тут вам не там! )
давай на ты! ок?
ну не зависает, а просто не раегирует, на CAD и тд. Num Lock и Caps работают
ага, WlxDisplaySASNotice поустой.
но в WlxLogoff, есть вот такое
pWlxFuncs->WlxSasNotify(hGlobalWlx, GINA_LOGOFF_NOTIFY);
это, что бы после логофа вызволась WlxLoggedOutSAS, с dwSasType == GINA_LOGOFF_NOTIFY.
V__>Если да, то у меня было что-то похожее. Проверял всевозможные утечки памяти и ресурсов, не обнаружил. Нашел следующее решение проблемы.
V__>Значит, комп если долго не трогать, он начинает засыпать. При засыпании он логоффится, блокируется, и еще там всякая фигня. Но в моей джине не работало путём: рабочий стол очищался, и так всё замирало. Я вёл debug-лог, там было видно, что в этом зависании фактически вызывается раз за разом WlxScreenSaverNotify, и еще, кажется, какая-то функция, ответственная за вывод диалога с сообщением в этом случае. Щас не помню деталей, некоторое время не работал над этим проектом. Так вот, во все пустые функции WlxЧё-ТоТам, которые должны/могут отображать диалог с сообщением, я запихнул по диалогу, и проблема пропала. Как я понял (могу жестоко ошибаться), проблема была в том, что эти диалоги убиваются каким-то своим особым винлогоновским способом (то ли по SAS-event'у, то ли еще как), и одновременно с этим прекращается работа Wlx-функции, которая этот диалог отобразила. Пока диалог (модальный!) существует, Wlx-функция работает. Пришел евент — умирает вместе с диалогом. Но если она (или диалог) закончили работу по каким-то другим причинам (напр. нажали ОК на диалоге, или вовсе его не создавали) — функция сразу же снова вызывается. Infinite loop. Отображением диалога я ее как бы "стопорил", чтобы вызывалась единожды.
про трейсу видно, что WlxScreenSaverNotify не вызывается, да если бы вызывалась, то вернулось бы FALSE.
V__>Не знаю, решение это проблемы, или кривой обход — но с виду вроде как помогло
Здравствуйте, 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 мы не отображаем и тогда вышеописанная проблема отпадает сама собой.
Здравствуйте, .Mistery, Вы писали:
M>Здравствуйте, Vladimir_the_Red_Sunny, Вы писали:
V__>>Появляется диалог логона. Если не логиниться, и вообще его не трогать, то через две минуты он исчезает сам, а комп "зависает"? В этом проблема? А WlxDisplaySASNotice пустая у Вас?
M>Она не должна быть пустая, в ней как раз то и должен выводится диалог логина юзера.
не согласен. там должно показхываться приведствие (или быть пустой), а logon dialog должен показываться в WlxLoggedOutSAS.
M>Если в WlxScreenSaverNotify вернуть FALSE то никаких засыпаний не будет.
так и есть.
M>WlxDisplayStatusMessage, возвращаем FALSE и winlogon знает что никаких messages небыло отображено.
и так тоже.
M>Они не должны быть пустые, т.е. хотябы TRUE или FALSE они должны возвращать. И запихивать туда диалоги вовсе не обязательно.
+1
Ах, всетаки не уверен, что это правильно, WlxDisplaySASNotice.
T>и все. нет никаких GDI объектов и так дале.. меседж луп я тоже не засоряю.
M>>Если уж сильно нужно будет, для чистоты эксперемента, могу выслать тебе свою GINA, запустишь ее и посмотрим будет у меня диалог пропадать или нет!
T>давай, если не трудно мыло профайле.
Здравствуйте, Toughpheeckouse, Вы писали:
T>Здравствуйте, .Mistery, Вы писали:
M>>Здравствуйте, Vladimir_the_Red_Sunny, Вы писали:
V__>>>Появляется диалог логона. Если не логиниться, и вообще его не трогать, то через две минуты он исчезает сам, а комп "зависает"? В этом проблема? А WlxDisplaySASNotice пустая у Вас?
M>>Она не должна быть пустая, в ней как раз то и должен выводится диалог логина юзера. T>не согласен. там должно показхываться приведствие (или быть пустой), а logon dialog должен показываться в WlxLoggedOutSAS.
Наверное мы не так друг друга поняли или обьяснили друг другу неправильно. Да если речь идет именно о диалоги логина юзера то конечно мы должны его вывести после получения SAS, например CTRL-ALT-DEL
MSDN:
The WlxLoggedOutSAS Winlogon calls this function when it receives an SAS event while no user is logged on.
У меня просто сделано немного не так. В WlxDisplaySASNotice проходит весь цикл жизни всех диалогов, после долгих эксперементов это оказалось разумным.
MSDN:
The WlxDisplaySASNotice Winlogon calls this function when no user is logged on.
Потому как, а что делать если есть заставка winlogon, и пока еще WlxLoggedOutSAS не сработал, а user захотел выключить комп или перезагрузить? Или тебе нужно среагировать на какие либо события WM_DEVICECHANGE например и проверить какой нибудь девайс, например SMARTCARD или еще чего нибудь. Как ты это обработаешь? А у меня это работает так. В WlxDisplaySASNotice работает DUMMY диалог у которого есть только кнопка выключения, через которую можно вызвать диалог с тремя кнопками (Stand BY, Restart, Shutdown). Выглядит это так ка у MS GINA при загрузке компа, внизу кнопочка выключения. А так же при данном подходе у тебя работает message loop в котором ты ловишь все event которые тебе нужны, такие например как WM_DEVICECHANGE и т.д. В итоге получаешь более гибкий контроль. И диалог логина юзера уже запускается и message loop этого dummy диалога.
M>>Если в WlxScreenSaverNotify вернуть FALSE то никаких засыпаний не будет. T>так и есть.
M>>WlxDisplayStatusMessage, возвращаем FALSE и winlogon знает что никаких messages небыло отображено. T>и так тоже.
M>>Они не должны быть пустые, т.е. хотябы TRUE или FALSE они должны возвращать. И запихивать туда диалоги вовсе не обязательно. T>+1
Вобщем я воспользовался твоим советом.
Сделал что бы Logon даилог показывался в WlxDisplaySASNotice.
Вроде как работает.
Но непонимание, почему не работает в WlxLoggedOutSAS осталось!
Спасибо!
ЗЫ:
ты бы сделал в своем логон диалоге, что бы таб работал
и еще, у тебя не инициализирутся переменные коружения типа USERNAME и тд.
Здравствуйте, .Mistery, Вы писали:
M>Она не должна быть пустая, в ней как раз то и должен выводится диалог логина юзера. ТОлько нельзя забывать, что когда основной поток будет ползать по message loop диалога, вполне может возникнуть какой нибудь SAS и winlogon вызовет соответствующую ф-ю GINA в другом потоке. Это остается на контроле программиста, что делать в данном случае, я в таких случаях всегда возвращал WLX_SAS_ACTION_NONE, а весь контроль держал сам в диалоге.
У меня в WlxDisplaySASNotice выводилось предложение нажать Ctrl+Alt+del, а диалог логина — в WlxLoggedOutSAS. Это чем-то неправильно?
M>Если в WlxScreenSaverNotify вернуть FALSE то никаких засыпаний не будет.
Категорически утверждать не возьмусь, потому что не помню, но, кажется, он почему-то все равно засыпал...
V__>>и еще, кажется, какая-то функция, ответственная за вывод диалога с сообщением в этом случае.
M>WlxDisplayStatusMessage, возвращаем FALSE и winlogon знает что никаких messages небыло отображено.
V__>>Щас не помню деталей, некоторое время не работал над этим проектом. Так вот, во все пустые функции WlxЧё-ТоТам, которые должны/могут отображать диалог с сообщением, я запихнул по диалогу, и проблема пропала.
M>Они не должны быть пустые, т.е. хотябы TRUE или FALSE они должны возвращать. И запихивать туда диалоги вовсе не обязательно.
Посмотрел. Бесконечно вызывалась функция WlxDisplayLockedNotice. Возвращать тру-фолс она не могёт, ибо воид.
V__>>Пока диалог (модальный!) существует, Wlx-функция работает. Пришел евент — умирает вместе с диалогом. Но если она (или диалог) закончили работу по каким-то другим причинам (напр. нажали ОК на диалоге, или вовсе его не создавали) — функция сразу же снова вызывается. Infinite loop. Отображением диалога я ее как бы "стопорил", чтобы вызывалась единожды.
M>Именно так оно и работает, это нужно самому контролировать.
А как?
M>Как я уже сказал можно просто возвращать везде FALSE и говорить о том что никаких display messages мы не отображаем и тогда вышеописанная проблема отпадает сама собой.