Создание оболочки вокруг всех функций потоков
Функция SetUnhandledExceptionFilter позволяет включать все функции потоков в SEH фрейм:
PTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter( PTOP_LEVEL_EXCEPTION_FILTER pTopLevelExceptionFilter);
После ее вызова необработанное исключение, возникшее в любом из потоков процесса, приведет к вызову Вашего фильтра исключений Адрес фильтра следует передать в единственном параметре функции SetUnhandledExceptionFilter. Прототип этой функции-фильтра должен выглядеть так:
LONG UnhandledExceptionFilter(PEXCEPTION_POINTCRS pExceptionInfo);
По форме она идентична функции UnhandledExceptionFilter Внутри фильтра мож но проводить любую обработку, а возвращаемым значением должен быть один из трех идентификаторов типа EXCEPTION_*. В следующей таблице описано, что происходит в случае возврата каждого из идентификаторов.
Идентификатор |
Действие | ||
EXCEPTION_EXECUTE_HANDLER |
Процесс просто завершается, так как система не выполняет никаких операций в своем обработчи ке исключений | ||
EXCEPTION_CONTINUE_EXECUTION |
Выполнение продолжается с инструкции, выгнав шей исключение; Вы можете модифицировать ин формацию об исключении, па которую указывает параметр типа PEXCEPTION_POINTERS | ||
EXCEPTION_CONTINUE_SEARCH |
Выполняется обычная Windows-функция UnhandledExceptionFilter |
Чтобы функция UnhandledExceptionFilter вновь стала фильтром по умолчанию, вызовите SetUnhandledExceptinnFilter со значением NULL, Заметьте также, что всякий раз, когда устанавливается новый фильтр для необработанных исключений, SetUnhandledExceptionFilter возвращает адрес ранее установленного фильтра. Если таким фильтром была UnhandledExceptionFilter, возвращается NULL. Если Ваш фильтр возвра щает EXCEPTION_CONTINUE_SEARCH, Вы должны вызывать ранее установленный фильтр, адрес которого вернула SetUnbandledExceptionFilter.