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

Поиск:

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


uploading...
****


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

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



semibug

я и не замечал что там изменено..вроде то же самое, DLL слово маленькое, практически незаметное smile так вы CRT линкуете.
А зачем это надо если не секрет?

Добавлено через 1 минуту и 20 секунд
MSDN по этому поводу говорит вот что
Цитата

Using the statically linked CRT implies that any state information saved by the C runtime library will be local to that instance of the CRT. For example, if you use strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l when using a statically linked CRT, the position of the strtok parser is unrelated to the strtok state used in code in the same process (but in a different DLL or EXE) that is linked to another instance of the static CRT. In contrast, the dynamically linked CRT shares state for all code within a process that is dynamically linked to the CRT. This concern does not apply if you use the new more secure versions of these functions; for example, strtok_s does not have this problem.

Because a DLL built by linking to a static CRT will have its own CRT state, it is not recommended to link statically to the CRT in a DLL unless the consequences of this are specifically desired and understood. For example, if you call _set_se_translator in an executable that loads the DLL linked to its own static CRT, any hardware exceptions generated by the code in the DLL will not be caught by the translator, but hardware exceptions generated by code in the main executable will be caught.

при статической линковке может и не сработать. Тут C++ не виноват..зачем статически линковать CRT?
PM   Вверх
jonie
Дата 30.5.2009, 20:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



т.к. винда то читайте про SetConsoleCtrlHandler и SetConsoleMode наверно...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
azesmcar
Дата 30.5.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



есть еще microsoft extension _onexit, но я сомневаюсь что он сработает. При статической линковке надо подумать какие могут возникать проблемы и от чего, насчет atexit, _onexit MSDN ничего не говорит, но какие-то проблемы он предполагает.

Добавлено через 10 секунд
http://msdn.microsoft.com/en-us/library/abx4dbyh(VS.80).aspx
PM   Вверх
azesmcar
Дата 30.5.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(jonie @  30.5.2009,  20:41 Найти цитируемый пост)
т.к. винда то читайте про SetConsoleCtrlHandler и SetConsoleMode наверно... 

кстати да! Это идея

semibug вот ваш код.
Код

BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
{
    MessageBoxA(0, "handler", "test", MB_OK);
    return FALSE;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    AllocConsole();
    SetConsoleCtrlHandler(HandlerRoutine, true);
    FILE *stream;
    freopen_s( &stream, "CONOUT$", "wt", stdout );
    printf( "just terminate trick\n" );

    while ( 1 )
    {
        Sleep( 10 );
    }

    return 0;
}

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


Опытный
**


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

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



Цитата(azesmcar @  30.5.2009,  20:33 Найти цитируемый пост)
так вы CRT линкуете.
А зачем это надо если не секрет?

В проекте, где наткнулся на эту особенность уже и не вспомню кто и когда переключил тип линковки CRT (надо ещё в svn поковыряться). Для нового проекта - чисто из академических соображений переключил, ибо в дефолтовых условиях все работало ).


Цитата(jonie @  30.5.2009,  20:41 Найти цитируемый пост)
т.к. винда то читайте про SetConsoleCtrlHandler

Преогромнейшее спасибо. Работает.

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


Опытный
**


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

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



В выше приведенном способе c SetConsoleCtrlHandler,  Windows все равно убивает процесс через 5 секунд после нажатия на крестик (если вернуть TRUE в обработчике) . В принципе этого достаточно чтобы сохранить данные приложения на диск (не 100 процентов случаев) . Но на всякий случай отключил совсем действия крестика:

    hm = GetSystemMenu( hWnd, FALSE );
    DeleteMenu( hm, SC_CLOSE , MF_BYCOMMAND );

где hWnd- хэндл окна консольного приложения.

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


uploading...
****


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

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



Цитата(semibug @  31.5.2009,  08:19 Найти цитируемый пост)
В выше приведенном способе c SetConsoleCtrlHandler,  Windows все равно убивает процесс через 5 секунд после нажатия на крестик (если вернуть TRUE в обработчике) . В принципе этого достаточно чтобы сохранить данные приложения на диск (не 100 процентов случаев) . Но на всякий случай отключил совсем действия крестика:

    hm = GetSystemMenu( hWnd, FALSE );
    DeleteMenu( hm, SC_CLOSE , MF_BYCOMMAND );

где hWnd- хэндл окна консольного приложения.

msdn почитайте.
Там же написано.
Если вы сами обрабатываете команду - возвращайте TRUE, если нет - FALSE чтобы виндоуз передал команду следующему обработчику.
Обработать команду не значит удалить свое меню а значит завешить свою программу так как указано в параметре. Просто делайте то что вам надо и всегда возвращайте FALSE.
PM   Вверх
semibug
Дата 31.5.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



azesmcar,
    Дело в том, что если я не успеваю выполнить необходимые действия, Windows убивает процесс  не дожидаясь завершения обработчика (либо выводит табличку о том, что прога зависла и предложит убить её).
А отключение крестика, конечно не в обработчик закрытия вставил. А сразу после создания консоли. При этом необходимость обрабатывать закрытие окна отпадает.

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


uploading...
****


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

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



Цитата(semibug @  31.5.2009,  17:15 Найти цитируемый пост)
azesmcar,
    Дело в том, что если я не успеваю выполнить необходимые действия, Windows убивает процесс  не дожидаясь завершения обработчика (либо выводит табличку о том, что прога зависла и предложит убить её). Причем не зависимо от того, что вернет обработчик (TRUE или FALSE).

А отключение крестика, конечно не в обработчик закрытия вставил. А сразу после создания консоли. При этом необходимость обрабатывать закрытие окна отпадает.

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


Опытный
**


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

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



Цитата(azesmcar @  31.5.2009,  17:18 Найти цитируемый пост)
Да..если долго думать виндоуз подумает что ваше приложение зависло..а чего вы так долго делаете то в обработчике? 

Да в общем то ничего особенного, сохраняю некоторые данные на диск.
Это конечно много времени не занимает, но всяко разно. У меня, например, подключен к компу внешний диск WD MyBook, так он, если его не трогать отключается, а при попытки доступа к нему разгоняется долго. Хотелось однозначно завершить операцию. Рассматривал вариант с запуском небольшого отдельного процесса, который после смерти основного приложения займется работой по сохранению, но, сами понимаете, выглядит некультурно. Поэтому и остановился на полном запрещении отрубать прогу крестиком (для нормальнго завершения предусмотрены штатные средства в самом приложении).

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


uploading...
****


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

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



semibug

Вам надо подумать в сторону отмены закрытия приложения и закрытся самому как только все завершите
Еще как вариант, просто закрыть консоль но не сам процесс. 

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(semibug @  31.5.2009,  19:15 Найти цитируемый пост)
Дело в том, что если я не успеваю выполнить необходимые действия, Windows убивает процесс  не дожидаясь завершения обработчика (либо выводит табличку о том, что прога зависла и предложит убить её).

попробуй поиграться с SetProcessShutdownParameters и флагом SHUTDOWN_NORETRY
окошко показываться не должно, а вот на счет самоотмирания процесса, тут можно с первым параметром поработать
тогда и Close затенять не придется (прикрыт процесс может быть не обязательно с кнопки)


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

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


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

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


 




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


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

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