Программно перехватывает событие закрытия окон при отсутствии ресурсов GDI - PullRequest
0 голосов
/ 09 октября 2011

Я пытаюсь перехватить все неожиданные завершения в моем процессе.

Я использовал эти функции, чтобы перехватывать все необработанные ошибки и исключения, о которых я могу думать, но все же этого недостаточно:

    SetUnhandledExceptionFilter(OnUnhandledNativeException);

    set_terminate(set_terminateHandler);

    set_unexpected(set_unexpectedHandler);

    _set_purecall_handler(set_purecallHandler);

    _set_new_handler(HandleProgramMemoryDepletion);       

    _set_invalid_parameter_handler(InvalidParameterHandler);

    signal(SIGABRT, sigabrt_handler); 
    signal(SIGINT, sigabrt_handler);
    signal(SIGTERM , sigabrt_handler);

Эти функции улавливают практически любую ошибку в приложении.

Но когда приложение завершается из-за сбоя GDI (например, GDI из ресурсов), ни одна из этих функций не вызывается.

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

И кто-нибудь знает какие-либо другие странные сценарии, когда этих функций просто недостаточно?

Примечание:

Точная ошибка, которую он не перехватывает: «Требуемый ресурс был недоступен».
Это происходит, когда вы создаете много объектов GDI и не выпускаете их.
Сбой программы из-за недостатка ресурсов задолго до того, как ей не хватит памяти.

Ответы [ 3 ]

0 голосов
/ 09 октября 2011
  1. Некоторые из перечисленных вами функций (например, SetUnhandledExceptionFilter) устанавливают обработчики для текущего потока. Поэтому вы должны вызывать их в каждой теме.
  2. Вы можете добавить векторную обработку исключений в список (AddVectoredExceptionHandler).
0 голосов
/ 09 октября 2011

Хорошо, проблема решена.

БЫЛ ловить сбой.

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

Конечно,у нас нет объектов GDI, поэтому форма не может быть нарисована, так что сама по себе выдает исключение, у нас было еще одно необработанное исключение, и процесс действительно завершился сбоем.

0 голосов
/ 09 октября 2011

Если вы используете Visual C ++ __, попробуйте __finally , как правило, добьется цели.Обратите внимание, что это не переносимое решение.

...