4 / 4 / 3
Регистрация: 30.09.2012
Сообщений: 63
1

При получении WM_ENDSESSION Windows не дает корректно завершить программу

23.03.2015, 15:55. Показов 1843. Ответов 6
Метки нет (Все метки)

Всем привет!

В моем приложении есть скрытое окно, которое получает от винды сообщения, т.е. ui для пользователя нет (запуск через командную строку). Когда скрытое окно получает WM_ENDSESSION, в коллбек мы заходим, но не выполняем всю функцию до конца (тупо прерываемся). Такое чувство, что винда не дает это сделать. При ручной посылке окну приложения WM_ENDSESSION все дорабатывает до конца и корректно. Может для скрытых окон какие-то "слабые" преференции?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2015, 15:55
Ответы с готовыми решениями:

Как корректно завершить программу при перзагрузке или отключении компьютера?
Как быть? Работает программа (чтение/запись данных в таблицу Access), а тут - перезагрузка или...

Windows не дает завершить форматирование (на флешке)
Ребят,такая проблема:Отформатировал флешку,на следующий раз просит тоже отформатировать я это...

Windows не дает закрыть программу при обновлении оной
Всем добрый день. Помогите ламеру с одним вопросом. Суть такова: есть программа, база данных,...

Ошибка при получении сведений о безопасности файла getlasterror 5, винда не даёт повысить права на папку
Понятное дело, что на папку Program Files нет прав соответствующих группе "администраторы" и...

6
Ушел с форума
Эксперт С++
16452 / 7416 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
23.03.2015, 16:41 2
Windows дает 5 секунд на обработку WM_ENDSESSION.
Может быть, в этом дело ?
0
4 / 4 / 3
Регистрация: 30.09.2012
Сообщений: 63
23.03.2015, 18:53  [ТС] 3
Убежденный, знаю про это, отдельный поток у меня считал количество секунд, 3 не было даже.
0
Ушел с форума
Эксперт С++
16452 / 7416 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
23.03.2015, 18:58 4
А можете код обработки WM_ENDSESSION показать ?
0
4 / 4 / 3
Регистрация: 30.09.2012
Сообщений: 63
23.03.2015, 20:14  [ТС] 5
C++
1
2
3
4
void WndMain::onEndSession(LMessage &msg)
{
    DoEndSession();
}
В DoEndSession() мы делаем пару обычных вызовов (сохраняем данные в файлик, закрываем хэндлы и пр.)

Добавлено через 7 минут
Смотрите, что нашел здесь:

Windows Vista will also not allow console applications or applications that have no visible top-level windows to block shutdown.
Это не оно?

Добавлено через 10 минут
Получается может попробовать из статьи выше эти функции (только завтра смогу протестить)?

C++
1
2
3
BOOL ShutdownBlockReasonCreate(HWND hWnd, LPCWSTR pwszReason);
BOOL ShutdownBlockReasonDestroy(HWND hWnd);
BOOL ShutdownBlockReasonQuery(HWND hWnd, LPWSTR pwszBuff, DWORD *pcchBuff);
0
Ушел с форума
Эксперт С++
16452 / 7416 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
23.03.2015, 21:32 6
Цитата Сообщение от sashadereh Посмотреть сообщение
Это не оно?
Нет. Block shutdown - это когда вы возвращаете FALSE из WM_QUERYENDSESSION
(на Vista и выше нужно еще сделать ShutdownBlockReasonCreate).
А в обычных условиях на обработку WM_ENDSESSION дается 5 секунд,
после выхода из обработчика приложение завершается (а на Vista и выше
появляется shutdown dialog, где можно отменить завершение работы,
либо форсировать выход). Так что DoEndSession должен отрабатывать
до конца, если он не выполняется >= 5 сек.
0
4 / 4 / 3
Регистрация: 30.09.2012
Сообщений: 63
24.03.2015, 08:59  [ТС] 7
Убежденный, все оказалось так, как я и ожидал. Windows может не ждать 5 секунд вовсе, если у нас нет видимых окон (об этом написано в статье по ссылке выше).
Решение (может пригодиться кому-нибудь):
Опять-таки в статье описано 3 подхода. Я решил вернуть TRUE из WM_QUERYENDSESSION и в коллбеке на WM_ENDSESSION вызвал ShutdownBlockReasonCreate перед своей функцией-шатдаунером, после нее вызвал ShutdownBlockReasonDestroy соответственно.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2015, 08:59
Помогаю со студенческими работами здесь

Корректно завершить NotifyIcon
Доброй ночи! Вопрос скорее больше теоретический ибо на практике все спокойно прибивается гвоздями)...

Зацикливание при получении получении сообщения от клиента
Доброго времени суток! Уже выбился из сил... Суть моей проблемы в следующем. Реализую...

Как корректно завершить поток
Написал программу-терминал для работы с последовательным портом с учетом нашей специфики работы....

Как корректно завершить COM порт?
Здравствуйте. Пишу программу на С++ CLR для считывания с устройства пакетов данных. Но тут...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru