--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Name: wx/msw/seh.h
+// Purpose: declarations for SEH (structured exceptions handling) support
+// Author: Vadim Zeitlin
+// Created: 2006-04-26
+// RCS-ID: $Id$
+// 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(__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 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 7.1 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__ <= 1310
+ #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_
#include "wx/scopeguard.h"
#include "wx/msw/private.h"
+#include "wx/msw/seh.h"
#if wxUSE_ON_FATAL_EXCEPTION
#include "wx/datetime.h"
#include "wx/msw/crashrpt.h"
-
- #ifdef __VISUALC__
- #include <eh.h>
- #endif // __VISUALC__
#endif // wxUSE_ON_FATAL_EXCEPTION
#ifdef __WXWINCE__
wxGlobalSEInformation = pExcPtrs;
// give the user a chance to do something special about this
- __try
+ wxSEH_TRY
{
wxTheApp->OnFatalException();
}
- __except ( EXCEPTION_EXECUTE_HANDLER )
- {
- // nothing to do here, just ignore the exception inside the
- // exception handler
- ;
- }
+ wxSEH_IGNORE // ignore any exceptions inside the exception handler
wxGlobalSEInformation = NULL;
#ifdef __VISUALC__
-static void wxSETranslator(unsigned int WXUNUSED(code), EXCEPTION_POINTERS *ep)
+void wxSETranslator(unsigned int WXUNUSED(code), EXCEPTION_POINTERS *ep)
{
switch ( wxGlobalSEHandler(ep) )
{
{
DisableAutomaticSETranslator();
- __try
+ wxSEH_TRY
{
return wxEntryReal(argc, argv);
}
- __except ( wxGlobalSEHandler(GetExceptionInformation()) )
- {
- wxFatalExit();
-
-#if !defined(_MSC_VER) || defined(__WXDEBUG__) || (defined(_MSC_VER) && _MSC_VER <= 1200)
- // this code is unreachable but put it here to suppress warnings in some compilers
- // and disable for others to supress warnings too
- return -1;
-#endif // !__VISUALC__ in release build
- }
+ wxSEH_HANDLE(-1)
}
#else // !wxUSE_ON_FATAL_EXCEPTION