handle fatal exceptions in the other threads (based on patch 1459813 by Carl-Friedrich Braun)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38929 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -119,6 +119,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
|||||||
wx/msw/private.h
|
wx/msw/private.h
|
||||||
wx/msw/regconf.h
|
wx/msw/regconf.h
|
||||||
wx/msw/registry.h
|
wx/msw/registry.h
|
||||||
|
wx/msw/seh.h
|
||||||
wx/msw/stackwalk.h
|
wx/msw/stackwalk.h
|
||||||
wx/msw/stdpaths.h
|
wx/msw/stdpaths.h
|
||||||
wx/msw/winundef.h
|
wx/msw/winundef.h
|
||||||
|
74
include/wx/msw/seh.h
Normal file
74
include/wx/msw/seh.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// 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_
|
@@ -30,14 +30,11 @@
|
|||||||
#include "wx/scopeguard.h"
|
#include "wx/scopeguard.h"
|
||||||
|
|
||||||
#include "wx/msw/private.h"
|
#include "wx/msw/private.h"
|
||||||
|
#include "wx/msw/seh.h"
|
||||||
|
|
||||||
#if wxUSE_ON_FATAL_EXCEPTION
|
#if wxUSE_ON_FATAL_EXCEPTION
|
||||||
#include "wx/datetime.h"
|
#include "wx/datetime.h"
|
||||||
#include "wx/msw/crashrpt.h"
|
#include "wx/msw/crashrpt.h"
|
||||||
|
|
||||||
#ifdef __VISUALC__
|
|
||||||
#include <eh.h>
|
|
||||||
#endif // __VISUALC__
|
|
||||||
#endif // wxUSE_ON_FATAL_EXCEPTION
|
#endif // wxUSE_ON_FATAL_EXCEPTION
|
||||||
|
|
||||||
#ifdef __WXWINCE__
|
#ifdef __WXWINCE__
|
||||||
@@ -118,16 +115,11 @@ unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs)
|
|||||||
wxGlobalSEInformation = pExcPtrs;
|
wxGlobalSEInformation = pExcPtrs;
|
||||||
|
|
||||||
// give the user a chance to do something special about this
|
// give the user a chance to do something special about this
|
||||||
__try
|
wxSEH_TRY
|
||||||
{
|
{
|
||||||
wxTheApp->OnFatalException();
|
wxTheApp->OnFatalException();
|
||||||
}
|
}
|
||||||
__except ( EXCEPTION_EXECUTE_HANDLER )
|
wxSEH_IGNORE // ignore any exceptions inside the exception handler
|
||||||
{
|
|
||||||
// nothing to do here, just ignore the exception inside the
|
|
||||||
// exception handler
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxGlobalSEInformation = NULL;
|
wxGlobalSEInformation = NULL;
|
||||||
|
|
||||||
@@ -140,7 +132,7 @@ unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs)
|
|||||||
|
|
||||||
#ifdef __VISUALC__
|
#ifdef __VISUALC__
|
||||||
|
|
||||||
static void wxSETranslator(unsigned int WXUNUSED(code), EXCEPTION_POINTERS *ep)
|
void wxSETranslator(unsigned int WXUNUSED(code), EXCEPTION_POINTERS *ep)
|
||||||
{
|
{
|
||||||
switch ( wxGlobalSEHandler(ep) )
|
switch ( wxGlobalSEHandler(ep) )
|
||||||
{
|
{
|
||||||
@@ -208,20 +200,11 @@ int wxEntry(int& argc, wxChar **argv)
|
|||||||
{
|
{
|
||||||
DisableAutomaticSETranslator();
|
DisableAutomaticSETranslator();
|
||||||
|
|
||||||
__try
|
wxSEH_TRY
|
||||||
{
|
{
|
||||||
return wxEntryReal(argc, argv);
|
return wxEntryReal(argc, argv);
|
||||||
}
|
}
|
||||||
__except ( wxGlobalSEHandler(GetExceptionInformation()) )
|
wxSEH_HANDLE(-1)
|
||||||
{
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // !wxUSE_ON_FATAL_EXCEPTION
|
#else // !wxUSE_ON_FATAL_EXCEPTION
|
||||||
|
@@ -1970,7 +1970,7 @@ bool wxWindowMSW::DoPopupMenu(wxMenu *menu, int x, int y)
|
|||||||
#if defined(__WXWINCE__)
|
#if defined(__WXWINCE__)
|
||||||
UINT flags = 0;
|
UINT flags = 0;
|
||||||
#else
|
#else
|
||||||
UINT flags = TPM_RIGHTBUTTON | TPM_RECURSE;
|
UINT flags = TPM_RIGHTBUTTON;
|
||||||
#endif
|
#endif
|
||||||
::TrackPopupMenu(hMenu, flags, point.x, point.y, 0, hWnd, NULL);
|
::TrackPopupMenu(hMenu, flags, point.x, point.y, 0, hWnd, NULL);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user