X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/abca8ebff16ef0e95292a5ceb1aa9fc302552c5d..27d0dcd033be9b1356a36d582f3d3665a53e11e4:/src/common/init.cpp diff --git a/src/common/init.cpp b/src/common/init.cpp index 69dadc09e0..bc304d3be8 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -59,7 +59,11 @@ class wxDummyConsoleApp : public wxAppConsole { public: + wxDummyConsoleApp() { } + virtual int OnRun() { wxFAIL_MSG( _T("unreachable code") ); return 0; } + + DECLARE_NO_COPY_CLASS(wxDummyConsoleApp) }; // we need a special kind of auto pointer to wxApp which not only deletes the @@ -87,6 +91,8 @@ public: wxTheApp = ptr; } + + DECLARE_NO_COPY_CLASS(wxAppPtr) }; // class to ensure that wxAppBase::CleanUp() is called if our Initialize() @@ -111,6 +117,15 @@ public: ~wxCleanupOnExit() { wxEntryCleanup(); } }; +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// suppress warnings about unused variables +static inline void Use(void *) { } + +#define WX_SUPPRESS_UNUSED_WARN(x) Use(&x) + // ---------------------------------------------------------------------------- // initialization data // ---------------------------------------------------------------------------- @@ -141,8 +156,10 @@ static struct InitData // them to Unicode ourselves (this is the case under Unix but not Windows, // for example), we remember the converted argv here because we'll have to // free it when doing cleanup to avoid memory leaks - wchar_t *argv; + wchar_t **argv; #endif // wxUSE_UNICODE + + DECLARE_NO_COPY_CLASS(InitData) } gs_initData; // ============================================================================ @@ -168,9 +185,15 @@ static void ConvertArgsToUnicode(int argc, char **argv) static void FreeConvertedArgs() { - for ( int mb_argc = 0; mb_argc < wxTheApp->argc; mb_argc++ ) + if ( gs_initData.argv ) { - free(wxTheApp->argv[mb_argc]); + for ( int i = 0; i < gs_initData.argc; i++ ) + { + free(gs_initData.argv[i]); + } + + delete [] gs_initData.argv; + gs_initData.argv = NULL; } } @@ -374,8 +397,10 @@ int wxEntryReal(int& argc, wxChar **argv) // below returns or throws wxCleanupOnExit cleanupOnExit; + WX_SUPPRESS_UNUSED_WARN(cleanupOnExit); + // app initialization - if ( !wxTheApp->OnInit() ) + if ( !wxTheApp->CallOnInit() ) { // don't call OnExit() if OnInit() failed return -1; @@ -384,21 +409,6 @@ int wxEntryReal(int& argc, wxChar **argv) // app execution int retValue = wxTheApp->OnRun(); - // why should we do this? it doesn't close all window, just one of them and - // this shouldn't be necessary anyhow... -#if 0 - // close any remaining windows - wxWindow *topWindow = wxTheApp->GetTopWindow(); - if ( topWindow ) - { - // forcibly delete the window. - topWindow->Destroy(); - - // collect the dead objects - wxTheApp->DeletePendingObjects(); - } -#endif // 0 - // app clean up wxTheApp->OnExit(); @@ -409,7 +419,12 @@ int wxEntryReal(int& argc, wxChar **argv) // OnFatalException() if necessary #if defined(__WXMSW__) && wxUSE_ON_FATAL_EXCEPTION -extern unsigned long wxGlobalSEHandler(); +#ifdef __WXWINCE__ +// For ExitThread +#include "wx/msw/private.h" +#endif + +extern unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs); int wxEntry(int& argc, wxChar **argv) { @@ -417,12 +432,19 @@ int wxEntry(int& argc, wxChar **argv) { return wxEntryReal(argc, argv); } - __except ( wxGlobalSEHandler() ) + __except ( wxGlobalSEHandler(GetExceptionInformation()) ) { +#ifdef __WXWINCE__ + ::ExitThread(3); // the same exit code as abort() +#else ::ExitProcess(3); // the same exit code as abort() +#endif +#if !defined(_MSC_VER) || _MSC_VER < 1300 // this code is unreachable but put it here to suppress warnings + // from some compilers return -1; +#endif } }