+// ============================================================================
+// implementation: various entry points
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wrapper wxEntry catching all Win32 exceptions occuring in a wx program
+// ----------------------------------------------------------------------------
+
+// wrap real wxEntry in a try-except block to be able to call
+// OnFatalException() if necessary
+#if wxUSE_ON_FATAL_EXCEPTION && wxUSE_BASE
+
+// global pointer to exception information, only valid inside OnFatalException,
+// used by wxStackWalker and wxCrashReport
+extern EXCEPTION_POINTERS *wxGlobalSEInformation = NULL;
+
+// flag telling us whether the application wants to handle exceptions at all
+static bool gs_handleExceptions = false;
+
+unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs)
+{
+ if ( gs_handleExceptions && wxTheApp )
+ {
+ // store the pointer to exception info
+ wxGlobalSEInformation = pExcPtrs;
+
+ // give the user a chance to do something special about this
+ __try
+ {
+ wxTheApp->OnFatalException();
+ }
+ __except ( EXCEPTION_EXECUTE_HANDLER )
+ {
+ // nothing to do here, just ignore the exception inside the
+ // exception handler
+ ;
+ }
+
+ wxGlobalSEInformation = NULL;
+
+ // this will execute our handler and terminate the process
+ return EXCEPTION_EXECUTE_HANDLER;
+ }
+
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+
+#ifdef __VISUALC__
+
+static void wxSETranslator(unsigned int WXUNUSED(code), EXCEPTION_POINTERS *ep)
+{
+ wxGlobalSEHandler(ep);
+}
+
+#endif // __VISUALC__
+
+bool wxHandleFatalExceptions(bool doit)
+{
+ // assume this can only be called from the main thread
+ gs_handleExceptions = doit;
+
+#ifdef __VISUALC__
+ // VC++ (at least from 4.0 up to version 7.1) is incredibly broken in that
+ // a "catch ( ... )" will *always* catch SEH exceptions in it even though
+ // it should have never been the case... to prevent such catches from
+ // stealing the exceptions from our wxGlobalSEHandler which is only called
+ // if the exception is not handled elsewhere, we have to also call it from
+ // a special SEH translator function which is called by VC CRT when a Win32
+ // exception occurs
+
+ // this warns that /EHa (async exceptions) should be used when using
+ // _set_se_translator but, in fact, this doesn't seem to change anything
+ // with VC++ up to 7.1 -- to be confirmed with VC++ 8
+ #if _MSC_VER <= 1310
+ #pragma warning(disable:4535)
+ #endif
+
+ _set_se_translator(doit ? wxSETranslator : NULL);