X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c8a448977cbe609b4ce8f4092b3c2903556dc514..7bb82a7415a0fae8b691611665593e8550a7bcf7:/src/msw/main.cpp diff --git a/src/msw/main.cpp b/src/msw/main.cpp index 35f1ada5fc..00728f40fd 100644 --- a/src/msw/main.cpp +++ b/src/msw/main.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/main.cpp +// Name: src/msw/main.cpp // Purpose: WinMain/DllMain // Author: Julian Smart // Modified by: @@ -24,19 +24,20 @@ #pragma hdrstop #endif -#include "wx/event.h" -#include "wx/app.h" +#ifndef WX_PRECOMP + #include "wx/event.h" + #include "wx/app.h" +#endif //WX_PRECOMP + #include "wx/cmdline.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 - #endif // __VISUALC__ #endif // wxUSE_ON_FATAL_EXCEPTION #ifdef __WXWINCE__ @@ -117,16 +118,11 @@ unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs) 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; @@ -139,7 +135,7 @@ unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs) #ifdef __VISUALC__ -static void wxSETranslator(unsigned int WXUNUSED(code), EXCEPTION_POINTERS *ep) +void wxSETranslator(unsigned int WXUNUSED(code), EXCEPTION_POINTERS *ep) { switch ( wxGlobalSEHandler(ep) ) { @@ -207,20 +203,11 @@ int wxEntry(int& argc, wxChar **argv) { 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 @@ -260,10 +247,10 @@ static bool wxIsUnicodeAvailable() { static const wchar_t *ERROR_STRING = L"wxWidgets Fatal Error"; - if ( wxGetOsVersion() != wxWINDOWS_NT ) + if ( wxGetOsVersion() != wxOS_WINDOWS_NT ) { // we need to be built with MSLU support -#if !wxUSE_UNICODE_MSLU +#if !wxUSE_UNICODE_MSLU // note that we can use MessageBoxW() as it's implemented even under // Win9x - OTOH, we can't use wxGetTranslation() because the file APIs // used by wxLocale are not @@ -331,6 +318,20 @@ static bool wxIsUnicodeAvailable() // Windows-specific wxEntry // ---------------------------------------------------------------------------- +// helper function used to clean up in wxEntry() just below +// +// notice that argv elements are supposed to be allocated using malloc() while +// argv array itself is allocated with new +static void wxFreeArgs(int argc, wxChar **argv) +{ + for ( int i = 0; i < argc; i++ ) + { + free(argv[i]); + } + + delete [] argv; +} + WXDLLEXPORT int wxEntry(HINSTANCE hInstance, HINSTANCE WXUNUSED(hPrevInstance), wxCmdLineArgType WXUNUSED(pCmdLine), @@ -379,6 +380,8 @@ WXDLLEXPORT int wxEntry(HINSTANCE hInstance, // argv[] must be NULL-terminated argv[argc] = NULL; + wxON_BLOCK_EXIT2(wxFreeArgs, argc, argv); + return wxEntry(argc, argv); } @@ -403,4 +406,3 @@ void wxSetInstance(HINSTANCE hInst) } #endif // wxUSE_BASE -