+#endif // wxUSE_UNICODE
+
+// ----------------------------------------------------------------------------
+// clean up
+// ----------------------------------------------------------------------------
+
+// cleanup done before destroying wxTheApp
+static void DoCommonPreCleanup()
+{
+#if wxUSE_LOG
+ // flush the logged messages if any and install a 'safer' log target: the
+ // default one (wxLogGui) can't be used after the resources are freed just
+ // below and the user supplied one might be even more unsafe (using any
+ // wxWidgets GUI function is unsafe starting from now)
+ wxLog::DontCreateOnDemand();
+
+ // this will flush the old messages if any
+ delete wxLog::SetActiveTarget(new wxLogStderr);
+#endif // wxUSE_LOG
+}
+
+// cleanup done after destroying wxTheApp
+static void DoCommonPostCleanup()
+{
+ wxModule::CleanUpModules();
+
+ wxClassInfo::CleanUp();
+
+ // we can't do this in wxApp itself because it doesn't know if argv had
+ // been allocated
+#if wxUSE_UNICODE
+ FreeConvertedArgs();
+#endif // wxUSE_UNICODE
+
+ // Note: check for memory leaks is now done via wxDebugContextDumpDelayCounter
+#if wxUSE_LOG
+ // and now delete the last logger as well
+ delete wxLog::SetActiveTarget(NULL);
+#endif // wxUSE_LOG
+}
+
+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)