Re[11]: Централизованная обработка исключений
От: Ivan Россия www.rsdn.ru
Дата: 05.10.04 07:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>попробуй стандартный GetOpenFileName.

попробовал на Win XP. Unhandled Exception Filter вызвался для исключения Access Violation. Могу предположить, что на некоторых платформах фильтр заменяется, так как во время вызова GetOpenFileName загружаются библиотеки (например, comctl32.dll), которые используют CRT и если типы CRT приложения и библиотек не совпадают (single, multi, static, debug), то при инициализации CRT произойдет вызов SetUnhadledExceptionFilter.

Если речь идет о фильтре CRT, то он ведет себя по товарищески , если исключение не C++, то будет вызван предыдущий фильтр, а для C++ исключений можно использовать set_terminate — см. предыдущие сообщения.

проиллюстрирую примером:
LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo)
{
    printf("unhandled filter");
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    //LoadLibrary("mfc71.dll");
    throw 0;
    return 0;
}

этот пример бросает C++ exception. Если раскомментировать строчку LoadLibrary, то наш фильтр не вызовется — во время загрузки mfc42.dll проинициализруется CRT и заменит фильтр, но только для C++ исключений.
Если настроить компиляцию приложения с CRT "multithreaded dll" — то при загрузке mfc71.dll инициализации CRT не будет и фильтр опять же не переустановится.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.