+void wxEntryCleanup()
+{
+ DoCommonPreCleanup();
+
+
+ // delete the application object
+ if ( wxTheApp )
+ {
+ wxTheApp->CleanUp();
+
+ delete wxTheApp;
+ wxApp::SetInstance(NULL);
+ }
+
+
+ DoCommonPostCleanup();
+}
+
+// ----------------------------------------------------------------------------
+// wxEntry
+// ----------------------------------------------------------------------------
+
+#if !defined(__WXMSW__) || !wxUSE_ON_FATAL_EXCEPTION
+ #define wxEntryReal wxEntry
+#endif // !(__WXMSW__ && wxUSE_ON_FATAL_EXCEPTION)
+
+int wxEntryReal(int& argc, wxChar **argv)
+{
+ // library initialization
+ if ( !wxEntryStart(argc, argv) )
+ {
+ return -1;
+ }
+
+ // if wxEntryStart succeeded, we must call wxEntryCleanup even if the code
+ // below returns or throws
+ wxCleanupOnExit cleanupOnExit;
+
+ WX_SUPPRESS_UNUSED_WARN(cleanupOnExit);
+
+ wxTRY
+ {
+
+ // app initialization
+ if ( !wxTheApp->CallOnInit() )
+ {
+ // don't call OnExit() if OnInit() failed
+ return -1;
+ }
+
+ // ensure that OnExit() is called if OnInit() had succeeded
+ class CallOnExit
+ {
+ public:
+ ~CallOnExit() { wxTheApp->OnExit(); }
+ } callOnExit;
+
+ WX_SUPPRESS_UNUSED_WARN(callOnExit);
+
+ // app execution
+ return wxTheApp->OnRun();
+ }
+ wxCATCH_ALL( wxTheApp->OnUnhandledException(); return -1; )
+}
+
+// wrap real wxEntry in a try-except block to be able to call
+// OnFatalException() if necessary
+#if defined(__WXMSW__) && wxUSE_ON_FATAL_EXCEPTION
+
+#ifdef __WXWINCE__
+// For ExitThread
+#include "wx/msw/private.h"
+#endif
+
+extern unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs);
+
+int wxEntry(int& argc, wxChar **argv)
+{
+ __try
+ {
+ return wxEntryReal(argc, argv);
+ }
+ __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
+ }
+}
+
+#endif // __WXMSW__ && wxUSE_ON_FATAL_EXCEPTION
+
+#if wxUSE_UNICODE
+
+// as with wxEntryStart, we provide an ANSI wrapper
+int wxEntry(int& argc, char **argv)
+{
+ ConvertArgsToUnicode(argc, argv);
+
+ return wxEntry(argc, gs_initData.argv);
+}
+
+#endif // wxUSE_UNICODE
+
+// ----------------------------------------------------------------------------
+// wxInitialize/wxUninitialize
+// ----------------------------------------------------------------------------
+
+bool wxInitialize(int argc, wxChar **argv)
+{
+ wxCRIT_SECT_LOCKER(lockInit, gs_initData.csInit);
+
+ if ( gs_initData.nInitCount++ )
+ {
+ // already initialized
+ return true;
+ }
+
+ return wxEntryStart(argc, argv);
+}
+
+void wxUninitialize()
+{
+ wxCRIT_SECT_LOCKER(lockInit, gs_initData.csInit);
+
+ if ( !--gs_initData.nInitCount )
+ {
+ wxEntryCleanup();
+ }
+}
+