+ gs_initData.argv[i] = wxStrdup(wxConvLocal.cMB2WX(argv[i]));
+ }
+
+ gs_initData.argc = argc;
+ gs_initData.argv[argc] = NULL;
+}
+
+static void FreeConvertedArgs()
+{
+ if ( gs_initData.argv )
+ {
+ for ( int i = 0; i < gs_initData.argc; i++ )
+ {
+ free(gs_initData.argv[i]);
+ }
+
+ delete [] gs_initData.argv;
+ gs_initData.argv = NULL;
+ gs_initData.argc = 0;
+ }
+}
+
+#endif // wxUSE_UNICODE
+
+// ----------------------------------------------------------------------------
+// start up
+// ----------------------------------------------------------------------------
+
+// initialization which is always done (not customizable) before wxApp creation
+static bool DoCommonPreInit()
+{
+#if wxUSE_LOG
+ // install temporary log sink: we can't use wxLogGui before wxApp is
+ // constructed and if we use wxLogStderr, all messages during
+ // initialization simply disappear under Windows
+ //
+ // note that we will delete this log target below
+ wxLog::SetActiveTarget(new wxLogBuffer);
+#endif // wxUSE_LOG
+
+ return true;
+}
+
+// non customizable initialization done after wxApp creation and initialization
+static bool DoCommonPostInit()
+{
+ wxModule::RegisterModules();
+
+ if ( !wxModule::InitializeModules() )
+ {
+ wxLogError(_("Initialization failed in post init, aborting."));
+ return false;
+ }
+
+ return true;
+}
+
+bool wxEntryStart(int& argc, wxChar **argv)
+{
+ // do minimal, always necessary, initialization
+ // --------------------------------------------
+
+ // initialize wxRTTI
+ if ( !DoCommonPreInit() )
+ {
+ return false;
+ }
+
+
+ // first of all, we need an application object
+ // -------------------------------------------
+
+ // the user might have already created it himself somehow
+ wxAppPtr app(wxTheApp);
+ if ( !app.get() )
+ {
+ // if not, he might have used IMPLEMENT_APP() to give us a function to
+ // create it
+ wxAppInitializerFunction fnCreate = wxApp::GetInitializerFunction();
+
+ if ( fnCreate )
+ {
+ // he did, try to create the custom wxApp object
+ app.Set((*fnCreate)());
+ }
+ }
+
+ if ( !app.get() )
+ {
+ // either IMPLEMENT_APP() was not used at all or it failed -- in any
+ // case we still need something
+ app.Set(new wxDummyConsoleApp);
+ }
+
+
+ // wxApp initialization: this can be customized
+ // --------------------------------------------
+
+ if ( !app->Initialize(argc, argv) )
+ {
+ return false;
+ }
+
+ wxCallAppCleanup callAppCleanup(app.get());
+
+ // for compatibility call the old initialization function too
+ if ( !app->OnInitGui() )
+ return false;
+
+
+ // common initialization after wxTheApp creation
+ // ---------------------------------------------
+
+ if ( !DoCommonPostInit() )
+ return false;
+
+
+ // prevent the smart pointer from destroying its contents
+ app.release();
+
+ // and the cleanup object from doing cleanup
+ callAppCleanup.Dismiss();
+
+#if wxUSE_LOG
+ // now that we have a valid wxApp (wxLogGui would have crashed if we used
+ // it before now), we can delete the temporary sink we had created for the
+ // initialization messages -- the next time logging function is called, the
+ // sink will be recreated but this time wxAppTraits will be used
+ delete wxLog::SetActiveTarget(NULL);
+#endif // wxUSE_LOG
+
+ return true;
+}
+
+#if wxUSE_UNICODE
+
+// we provide a wxEntryStart() wrapper taking "char *" pointer too
+bool wxEntryStart(int& argc, char **argv)
+{
+ ConvertArgsToUnicode(argc, argv);
+
+ if ( !wxEntryStart(argc, gs_initData.argv) )
+ {
+ FreeConvertedArgs();
+
+ return false;