Явный вызов функции UnhandledExceptionFilter
Функция UnhandledExceptionFilter полностью задокументирована, и Вы можете сами вызывать ее в своих программах. Вот пример ее использования:
void Funcadelic()
{
__try
{
...
}
__except (ExpFltr(GetExceptionTnformation()))
{
...
}
}
LONG ExpFltr(PEXCEPTION_POINTERS pEP)
{
DWORD dwExceptionCode - pEP->ExceptionRecord.ExceptionCode;
if (dwExceptionCode == EXCEPTION_ACCESS_VIOLATION)
{
// что-то делаем здесь...
return(EXCEPTION_CONTINUE_EXFCUTION);
}
return(UnhandledExceptionFilter(pEP));
}
Исключение в блоке try функции Funcadelic приводит к вызову ExpFltr. Ей переда ется значение, возвращаемое GetExceptionlnformation. Внутри фильтра определяется код исключения и сравнивается с EXCEPTION_ACCESS_VIOLATION. Если было нару шение доступа, фильтр исправляет ситуацию и возвращает EXCEPTION_CONTI NUE_EXECUTION. Это значение заставляет систему возобновить выполнение програм мы с инструкции, вызвавшей исключение.
Если произошло какое-то другое исключение, ExpFltr вызывает UnhandledExcep tionFilter, передавая ей адрес структуры EXCEPTION_POINTERS. Функция Unhandled ExceptionFilter открывает окно, позволяющее завершить процесс или начать отладку. Ее возвращаемое значение становится и результатом функции ExpFltr.