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: seh.h 44451 2007-02-11 02:17:28Z VZ $
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_
75