Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перехватить закрытие консольного приложение 
:(
    Опции темы
semibug
Дата 30.5.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



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

PM   Вверх
azesmcar
Дата 30.5.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Код

void atexit_handler()
{
}

int main()
{
    atexit(atexit_handler);
    //...
}

PM   Вверх
semibug
Дата 30.5.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Срабатывает при нормальном завершении приложения (окончании функции main), 
если же закрывать мышкой по крестику - не входит в atexit_handler.
Сама консоль создаётся в оконном приложении (VS2005 C++) сразу после запуска.
Попробовал создать глобальный объект, с бряком в деструкторе. При нормальном завершении программы деструктор отрабатывает как положено, при закрытии по крестику нет.
PM   Вверх
azesmcar
Дата 30.5.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата(semibug @  30.5.2009,  16:18 Найти цитируемый пост)
если же закрывать мышкой по крестику - не входит в atexit_handler.

Смотря как закрывается, если terminate - то не войдет, если приложение нормально завершается - тогда обработчки сработает.
PM   Вверх
semibug
Дата 30.5.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @  30.5.2009,  16:21 Найти цитируемый пост)
Смотря как закрывается, если terminate - то не войдет, если приложение нормально завершается - тогда обработчки сработает. 

Дело в том, что специально я не обрабатываю никак закрытие консольного окна по клику на крестик.
Программа просто terminate-тится. По Alt-F4 ничего не происходит.
Вот и думаю, где же вставить обработчик, для события, когда юзер закроет окошко мышью (сбрасываю некоторые данные на диск перед завершением проги).

PM   Вверх
azesmcar
Дата 30.5.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата(semibug @  30.5.2009,  16:49 Найти цитируемый пост)
Программа просто terminate-тится. 

terminate не перехватывается из самой программы. Если ваша консоль зависла и не может быть нормально закрыта - тогда конечно atexit не поможет, в остальных случаях, если программу не терминейтят, atexit срабатывает.
PM   Вверх
semibug
Дата 30.5.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @  30.5.2009,  17:05 Найти цитируемый пост)
terminate не перехватывается из самой программы. Если ваша консоль зависла и не может быть нормально закрыта - тогда конечно atexit не поможет, в остальных случаях, если программу не терминейтят, atexit срабатывает. 

Ну тогда скажем так: как отучить Windows терминэйтить программы без предупреждения по нажатию крестика.
( при этом консоль не зависла, никаких предупреждений о принудительном закрытии процесса винда не показывает)
PM   Вверх
azesmcar
Дата 30.5.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



проверьте этот код
Код

#include <windows.h>
#include <iostream>

void atexit_handler()
{
    MessageBoxA(0, "G", "B", MB_OK);
}

int main()
{
    atexit(atexit_handler);
    while (true)
    {
        Sleep(1000);
    }
    return 0;
}

У меня работает.

Это сообщение отредактировал(а) azesmcar - 30.5.2009, 17:47
PM   Вверх
semibug
Дата 30.5.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @  30.5.2009,  17:45 Найти цитируемый пост)
У меня работает.

Попробуйте с Runtime Library Multi-threaded Debug (not DLL)
PM   Вверх
azesmcar
Дата 30.5.2009, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата(semibug @  30.5.2009,  18:29 Найти цитируемый пост)
Попробуйте с Runtime Library Multi-threaded Debug (not DLL) 

Ну...работает..вы проверили этот код?
вот что говорит MSDN по этой функции. 
Цитата

The atexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to atexit create a register of functions that are executed in last-in, first-out (LIFO) order. The functions passed to atexit cannot take parameters. atexit and _onexit use the heap to hold the register of functions. Thus, the number of functions that can be registered is limited only by heap memory.



Это сообщение отредактировал(а) azesmcar - 30.5.2009, 19:10
PM   Вверх
semibug
Дата 30.5.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



c Runtime Library Multi-threaded Debug atexit не срабатывает. (с Runtime Library Multi-threaded Debug DLL) работает нормально. Visual Studio 2005.
PM   Вверх
azesmcar
Дата 30.5.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата(semibug @  30.5.2009,  19:17 Найти цитируемый пост)
c Runtime Library Multi-threaded Debug atexit не срабатывает. (с Runtime Library Multi-threaded Debug DLL) работает нормально. Visual Studio 2005. 

Не нашел отличий.

Добавлено через 1 минуту и 40 секунд
У меня так и стоит (VS2008) и работает. Вот опции проекта.
Цитата

/Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt


Добавлено через 2 минуты и 5 секунд
Скиньте проект куда нибудь, гляну.
PM   Вверх
semibug
Дата 30.5.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Странно. В моем случае стоит переключить на Runtime Library Multi-threaded Debug как перестаёт работать.
Попробую собрать проект на другой системе..



Это сообщение отредактировал(а) semibug - 30.5.2009, 19:35

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  terminate.rar 4,07 Kb
PM   Вверх
azesmcar
Дата 30.5.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



semibug

Проверил, действительно не работает.
Создал новый проект Win32 с дефолт настройками, проверил - работает. Я не знаю что вы там в настройках проекта изменили. Надо проверить, но по дефолту стоит Runtime Library Multi-threaded Debug DLL и работает..проверьте, я посмотрю разницу в настройках. Интересно в чем дело.
PM   Вверх
semibug
Дата 30.5.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



azesmcar
Так же создал новый проект,
из настроек поменял только Runtime Library (стояло DLL, поставил без ). После чего перестал срабатывать atexit (до изменения работал).
Под перестал работать имею ввиду что не срабатывает, когда окно закрываем щелчком по крестику.

Это сообщение отредактировал(а) semibug - 30.5.2009, 20:25
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1398 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.