Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
sashadereh
3 / 3 / 3
Регистрация: 30.09.2012
Сообщений: 63
1

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

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

Всем привет!

В моем приложении есть скрытое окно, которое получает от винды сообщения, т.е. ui для пользователя нет (запуск через командную строку). Когда скрытое окно получает WM_ENDSESSION, в коллбек мы заходим, но не выполняем всю функцию до конца (тупо прерываемся). Такое чувство, что винда не дает это сделать. При ручной посылке окну приложения WM_ENDSESSION все дорабатывает до конца и корректно. Может для скрытых окон какие-то "слабые" преференции?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2015, 15:55
Ответы с готовыми решениями:

Как корректно завершить чужое приложение?
Мне надо завершить чужое приложени, чтоб оно типо завершило свои действие...

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

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

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

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

6
Убежденный
Ушел с форума
Эксперт С++
15998 / 7269 / 1180
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
23.03.2015, 16:41 2
Windows дает 5 секунд на обработку WM_ENDSESSION.
Может быть, в этом дело ?
0
sashadereh
3 / 3 / 3
Регистрация: 30.09.2012
Сообщений: 63
23.03.2015, 18:53  [ТС] 3
Убежденный, знаю про это, отдельный поток у меня считал количество секунд, 3 не было даже.
0
Убежденный
Ушел с форума
Эксперт С++
15998 / 7269 / 1180
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
23.03.2015, 18:58 4
А можете код обработки WM_ENDSESSION показать ?
0
sashadereh
3 / 3 / 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
Убежденный
Ушел с форума
Эксперт С++
15998 / 7269 / 1180
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
23.03.2015, 21:32 6
Цитата Сообщение от sashadereh Посмотреть сообщение
Это не оно?
Нет. Block shutdown - это когда вы возвращаете FALSE из WM_QUERYENDSESSION
(на Vista и выше нужно еще сделать ShutdownBlockReasonCreate).
А в обычных условиях на обработку WM_ENDSESSION дается 5 секунд,
после выхода из обработчика приложение завершается (а на Vista и выше
появляется shutdown dialog, где можно отменить завершение работы,
либо форсировать выход). Так что DoEndSession должен отрабатывать
до конца, если он не выполняется >= 5 сек.
0
sashadereh
3 / 3 / 3
Регистрация: 30.09.2012
Сообщений: 63
24.03.2015, 08:59  [ТС] 7
Убежденный, все оказалось так, как я и ожидал. Windows может не ждать 5 секунд вовсе, если у нас нет видимых окон (об этом написано в статье по ссылке выше).
Решение (может пригодиться кому-нибудь):
Опять-таки в статье описано 3 подхода. Я решил вернуть TRUE из WM_QUERYENDSESSION и в коллбеке на WM_ENDSESSION вызвал ShutdownBlockReasonCreate перед своей функцией-шатдаунером, после нее вызвал ShutdownBlockReasonDestroy соответственно.
1
24.03.2015, 08:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2015, 08:59

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

Корректно завершить асинхронный прием
Пишу многопоточный чат и столкнулся с такой проблемой: как завершить метод...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru