| 1 | /////////////////////////////////////////////////////////////////////////////// |
| 2 | // Name: wx/msw/seh.h |
| 3 | // Purpose: declarations for SEH (structured exceptions handling) support |
| 4 | // Author: Vadim Zeitlin |
| 5 | // Created: 2006-04-26 |
| 6 | // RCS-ID: $Id$ |
| 7 | // Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org> |
| 8 | // Licence: wxWindows licence |
| 9 | /////////////////////////////////////////////////////////////////////////////// |
| 10 | |
| 11 | #ifndef _WX_MSW_SEH_H_ |
| 12 | #define _WX_MSW_SEH_H_ |
| 13 | |
| 14 | #if wxUSE_ON_FATAL_EXCEPTION |
| 15 | |
| 16 | // the exception handler which should be called from the exception filter |
| 17 | // |
| 18 | // it calsl wxApp::OnFatalException() if possible |
| 19 | extern unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs); |
| 20 | |
| 21 | // helper macro for wxSEH_HANDLE |
| 22 | #if defined(__BORLANDC__) || (defined(__VISUALC__) && (__VISUALC__ <= 1200)) |
| 23 | // some compilers don't understand that this code is unreachable and warn |
| 24 | // about no value being returned from the function without it, so calm them |
| 25 | // down |
| 26 | #define wxSEH_DUMMY_RETURN(rc) return rc; |
| 27 | #else |
| 28 | #define wxSEH_DUMMY_RETURN(rc) |
| 29 | #endif |
| 30 | |
| 31 | // macros which allow to avoid many #if wxUSE_ON_FATAL_EXCEPTION in the code |
| 32 | // which uses them |
| 33 | #define wxSEH_TRY __try |
| 34 | #define wxSEH_IGNORE __except ( EXCEPTION_EXECUTE_HANDLER ) { } |
| 35 | #define wxSEH_HANDLE(rc) \ |
| 36 | __except ( wxGlobalSEHandler(GetExceptionInformation()) ) \ |
| 37 | { \ |
| 38 | /* use the same exit code as abort() */ \ |
| 39 | ::ExitProcess(3); \ |
| 40 | \ |
| 41 | wxSEH_DUMMY_RETURN(rc) \ |
| 42 | } |
| 43 | |
| 44 | #else // wxUSE_ON_FATAL_EXCEPTION |
| 45 | #define wxSEH_TRY |
| 46 | #define wxSEH_IGNORE |
| 47 | #define wxSEH_HANDLE(rc) |
| 48 | #endif // wxUSE_ON_FATAL_EXCEPTION |
| 49 | |
| 50 | #if wxUSE_ON_FATAL_EXCEPTION && defined(__VISUALC__) && !defined(__WXWINCE__) |
| 51 | #include <eh.h> |
| 52 | |
| 53 | // C++ exception to structured exceptions translator: we need it in order |
| 54 | // to prevent VC++ from "helpfully" translating structured exceptions (such |
| 55 | // as division by 0 or access violation) to C++ pseudo-exceptions |
| 56 | extern void wxSETranslator(unsigned int code, EXCEPTION_POINTERS *ep); |
| 57 | |
| 58 | // up to VC 7.1 this warning ("calling _set_se_translator() requires /EHa") |
| 59 | // is harmless and it's easier to suppress it than use different makefiles |
| 60 | // for VC5 and 6 (which don't support /EHa at all) and VC7 (which does |
| 61 | // accept it but it seems to change nothing for it anyhow) |
| 62 | #if __VISUALC__ <= 1310 |
| 63 | #pragma warning(disable: 4535) |
| 64 | #endif |
| 65 | |
| 66 | // note that the SE translator must be called wxSETranslator! |
| 67 | #define DisableAutomaticSETranslator() _set_se_translator(wxSETranslator) |
| 68 | #else // !__VISUALC__ |
| 69 | // the other compilers do nothing as stupid by default so nothing to do for |
| 70 | // them |
| 71 | #define DisableAutomaticSETranslator() |
| 72 | #endif // __VISUALC__/!__VISUALC__ |
| 73 | |
| 74 | #endif // _WX_MSW_SEH_H_ |