| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: wx/msw/seh.h
- // Purpose: declarations for SEH (structured exceptions handling) support
- // Author: Vadim Zeitlin
- // Created: 2006-04-26
- // Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org>
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_MSW_SEH_H_
- #define _WX_MSW_SEH_H_
- #if wxUSE_ON_FATAL_EXCEPTION
- // the exception handler which should be called from the exception filter
- //
- // it calsl wxApp::OnFatalException() if possible
- extern unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs);
- // helper macro for wxSEH_HANDLE
- #if defined(__BORLANDC__) || (defined(__VISUALC__) && (__VISUALC__ <= 1200))
- // some compilers don't understand that this code is unreachable and warn
- // about no value being returned from the function without it, so calm them
- // down
- #define wxSEH_DUMMY_RETURN(rc) return rc;
- #else
- #define wxSEH_DUMMY_RETURN(rc)
- #endif
- // macros which allow to avoid many #if wxUSE_ON_FATAL_EXCEPTION in the code
- // which uses them
- #define wxSEH_TRY __try
- #define wxSEH_IGNORE __except ( EXCEPTION_EXECUTE_HANDLER ) { }
- #define wxSEH_HANDLE(rc) \
- __except ( wxGlobalSEHandler(GetExceptionInformation()) ) \
- { \
- /* use the same exit code as abort() */ \
- ::ExitProcess(3); \
- \
- wxSEH_DUMMY_RETURN(rc) \
- }
- #else // wxUSE_ON_FATAL_EXCEPTION
- #define wxSEH_TRY
- #define wxSEH_IGNORE
- #define wxSEH_HANDLE(rc)
- #endif // wxUSE_ON_FATAL_EXCEPTION
- #if wxUSE_ON_FATAL_EXCEPTION && defined(__VISUALC__) && !defined(__WXWINCE__)
- #include <eh.h>
- // C++ exception to structured exceptions translator: we need it in order
- // to prevent VC++ from "helpfully" translating structured exceptions (such
- // as division by 0 or access violation) to C++ pseudo-exceptions
- extern void wxSETranslator(unsigned int code, EXCEPTION_POINTERS *ep);
- // up to VC 12 this warning ("calling _set_se_translator() requires /EHa")
- // is harmless and it's easier to suppress it than use different makefiles
- // for VC5 and 6 (which don't support /EHa at all) and VC7+ (which does
- // accept it but it seems to change nothing for it anyhow)
- #if __VISUALC__ < 1900
- #pragma warning(disable: 4535)
- #endif
- // note that the SE translator must be called wxSETranslator!
- #define DisableAutomaticSETranslator() _set_se_translator(wxSETranslator)
- #else // !__VISUALC__
- // the other compilers do nothing as stupid by default so nothing to do for
- // them
- #define DisableAutomaticSETranslator()
- #endif // __VISUALC__/!__VISUALC__
- #endif // _WX_MSW_SEH_H_
|