ConvertToStandardCommandArgs() was ugly, buggy and leaked memory (not bad
for 10 lines of code). Now it's only ugly... git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@757 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
426
src/msw/app.cpp
426
src/msw/app.cpp
@@ -6,33 +6,33 @@
|
|||||||
// Created: 04/01/98
|
// Created: 04/01/98
|
||||||
// RCS-ID: $Id$
|
// RCS-ID: $Id$
|
||||||
// Copyright: (c) Julian Smart and Markus Holzem
|
// Copyright: (c) Julian Smart and Markus Holzem
|
||||||
// Licence: wxWindows license
|
// Licence: wxWindows license
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifdef __GNUG__
|
#ifdef __GNUG__
|
||||||
#pragma implementation "app.h"
|
#pragma implementation "app.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// For compilers that support precompilation, includes "wx.h".
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
#include "wx/wxprec.h"
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
#if defined(__BORLANDC__)
|
#if defined(__BORLANDC__)
|
||||||
#pragma hdrstop
|
#pragma hdrstop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef WX_PRECOMP
|
#ifndef WX_PRECOMP
|
||||||
#include "wx/frame.h"
|
#include "wx/frame.h"
|
||||||
#include "wx/app.h"
|
#include "wx/app.h"
|
||||||
#include "wx/utils.h"
|
#include "wx/utils.h"
|
||||||
#include "wx/gdicmn.h"
|
#include "wx/gdicmn.h"
|
||||||
#include "wx/pen.h"
|
#include "wx/pen.h"
|
||||||
#include "wx/brush.h"
|
#include "wx/brush.h"
|
||||||
#include "wx/cursor.h"
|
#include "wx/cursor.h"
|
||||||
#include "wx/icon.h"
|
#include "wx/icon.h"
|
||||||
#include "wx/palette.h"
|
#include "wx/palette.h"
|
||||||
#include "wx/dc.h"
|
#include "wx/dc.h"
|
||||||
#include "wx/dialog.h"
|
#include "wx/dialog.h"
|
||||||
#include "wx/msgdlg.h"
|
#include "wx/msgdlg.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "wx/msw/private.h"
|
#include "wx/msw/private.h"
|
||||||
@@ -41,22 +41,25 @@
|
|||||||
#include "wx/module.h"
|
#include "wx/module.h"
|
||||||
|
|
||||||
#if USE_WX_RESOURCES
|
#if USE_WX_RESOURCES
|
||||||
#include "wx/resource.h"
|
#include "wx/resource.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
#if defined(__WIN95__) && !defined(__GNUWIN32__)
|
#if defined(__WIN95__) && !defined(__GNUWIN32__)
|
||||||
#include <commctrl.h>
|
#include <commctrl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// use debug CRT functions for memory leak detections in VC++
|
// use debug CRT functions for memory leak detections in VC++
|
||||||
/* Doesn't work when using the makefiles, for some reason.
|
|
||||||
#if defined(__WXDEBUG__) && defined(_MSC_VER)
|
#if defined(__WXDEBUG__) && defined(_MSC_VER)
|
||||||
|
// VC++ uses this macro as debug/release mode indicator
|
||||||
|
#ifndef _DEBUG
|
||||||
|
#define _DEBUG
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <crtdbg.h>
|
#include <crtdbg.h>
|
||||||
#endif
|
#endif
|
||||||
*/
|
|
||||||
|
|
||||||
extern char *wxBuffer;
|
extern char *wxBuffer;
|
||||||
extern char *wxOsVersion;
|
extern char *wxOsVersion;
|
||||||
@@ -69,6 +72,7 @@ HINSTANCE wxhInstance = 0;
|
|||||||
static MSG s_currentMsg;
|
static MSG s_currentMsg;
|
||||||
wxApp *wxTheApp = NULL;
|
wxApp *wxTheApp = NULL;
|
||||||
|
|
||||||
|
// @@ why not const? and not static?
|
||||||
char wxFrameClassName[] = "wxFrameClass";
|
char wxFrameClassName[] = "wxFrameClass";
|
||||||
char wxMDIFrameClassName[] = "wxMDIFrameClass";
|
char wxMDIFrameClassName[] = "wxMDIFrameClass";
|
||||||
char wxMDIChildFrameClassName[] = "wxMDIChildFrameClass";
|
char wxMDIChildFrameClassName[] = "wxMDIChildFrameClass";
|
||||||
@@ -88,16 +92,17 @@ HBRUSH wxDisableButtonBrush = 0;
|
|||||||
LRESULT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM);
|
LRESULT APIENTRY wxWndProc(HWND, UINT, WPARAM, LPARAM);
|
||||||
|
|
||||||
#if !USE_SHARED_LIBRARY
|
#if !USE_SHARED_LIBRARY
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
|
IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
|
||||||
BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
|
|
||||||
EVT_IDLE(wxApp::OnIdle)
|
BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
|
||||||
END_EVENT_TABLE()
|
EVT_IDLE(wxApp::OnIdle)
|
||||||
|
END_EVENT_TABLE()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
long wxApp::sm_lastMessageTime = 0;
|
long wxApp::sm_lastMessageTime = 0;
|
||||||
|
|
||||||
#ifdef __WIN95__
|
#ifdef __WIN95__
|
||||||
static HINSTANCE gs_hRichEdit = NULL;
|
static HINSTANCE gs_hRichEdit = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//// Initialize
|
//// Initialize
|
||||||
@@ -106,32 +111,29 @@ bool wxApp::Initialize()
|
|||||||
{
|
{
|
||||||
wxBuffer = new char[1500];
|
wxBuffer = new char[1500];
|
||||||
|
|
||||||
/* Doesn't work when using the makefiles, for some reason.
|
|
||||||
#if defined(__WXDEBUG__) && defined(_MSC_VER)
|
#if defined(__WXDEBUG__) && defined(_MSC_VER)
|
||||||
// do check for memory leaks on program exit
|
// do check for memory leaks on program exit
|
||||||
// (another useful flag is _CRTDBG_DELAY_FREE_MEM_DF which doesn't free
|
// (another useful flag is _CRTDBG_DELAY_FREE_MEM_DF which doesn't free
|
||||||
// deallocated memory which may be used to simulate low-memory condition)
|
// deallocated memory which may be used to simulate low-memory condition)
|
||||||
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
|
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
|
||||||
#endif // debug build under MS VC++
|
#endif // debug build under MS VC++
|
||||||
*/
|
|
||||||
|
|
||||||
#if (WXDEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT
|
#if (WXDEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT
|
||||||
|
#if defined(_WINDLL)
|
||||||
|
streambuf* sBuf = NULL;
|
||||||
|
#else // EXE
|
||||||
|
streambuf* sBuf = new wxDebugStreamBuf;
|
||||||
|
#endif // DLL
|
||||||
|
|
||||||
#if !defined(_WINDLL)
|
ostream* oStr = new ostream(sBuf) ;
|
||||||
streambuf* sBuf = new wxDebugStreamBuf;
|
wxDebugContext::SetStream(oStr, sBuf);
|
||||||
#else
|
#endif // USE_MEMORY_TRACING
|
||||||
streambuf* sBuf = NULL;
|
|
||||||
#endif
|
|
||||||
ostream* oStr = new ostream(sBuf) ;
|
|
||||||
wxDebugContext::SetStream(oStr, sBuf);
|
|
||||||
|
|
||||||
#endif // USE_MEMORY_TRACING
|
|
||||||
|
|
||||||
wxClassInfo::InitializeClasses();
|
wxClassInfo::InitializeClasses();
|
||||||
|
|
||||||
#if USE_RESOURCES
|
#if USE_RESOURCES
|
||||||
wxGetResource("wxWindows", "OsVersion", &wxOsVersion);
|
wxGetResource("wxWindows", "OsVersion", &wxOsVersion);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
|
wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
|
||||||
wxTheColourDatabase->Initialize();
|
wxTheColourDatabase->Initialize();
|
||||||
@@ -139,41 +141,41 @@ bool wxApp::Initialize()
|
|||||||
wxInitializeStockLists();
|
wxInitializeStockLists();
|
||||||
wxInitializeStockObjects();
|
wxInitializeStockObjects();
|
||||||
|
|
||||||
#if USE_WX_RESOURCES
|
#if USE_WX_RESOURCES
|
||||||
wxInitializeResourceSystem();
|
wxInitializeResourceSystem();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// For PostScript printing
|
// For PostScript printing
|
||||||
#if USE_POSTSCRIPT
|
#if USE_POSTSCRIPT
|
||||||
wxInitializePrintSetupData();
|
wxInitializePrintSetupData();
|
||||||
wxThePrintPaperDatabase = new wxPrintPaperDatabase;
|
wxThePrintPaperDatabase = new wxPrintPaperDatabase;
|
||||||
wxThePrintPaperDatabase->CreateDatabase();
|
wxThePrintPaperDatabase->CreateDatabase();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxBitmap::InitStandardHandlers();
|
wxBitmap::InitStandardHandlers();
|
||||||
|
|
||||||
#if defined(__WIN95__)
|
#if defined(__WIN95__)
|
||||||
InitCommonControls();
|
InitCommonControls();
|
||||||
gs_hRichEdit = LoadLibrary("RICHED32.DLL");
|
gs_hRichEdit = LoadLibrary("RICHED32.DLL");
|
||||||
|
|
||||||
if (gs_hRichEdit == NULL)
|
if (gs_hRichEdit == NULL)
|
||||||
{
|
{
|
||||||
wxMessageBox("Could not initialise Rich Edit DLL");
|
wxMessageBox("Could not initialise Rich Edit DLL");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(WX_DRAG_DROP)
|
#if defined(WX_DRAG_DROP)
|
||||||
// we need to initialize OLE library
|
// we need to initialize OLE library
|
||||||
if ( FAILED(::OleInitialize(NULL)) )
|
if ( FAILED(::OleInitialize(NULL)) )
|
||||||
wxFatalError(_("Cannot initialize OLE"));
|
wxFatalError(_("Cannot initialize OLE"));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CTL3D
|
#if CTL3D
|
||||||
if (!Ctl3dRegister(wxhInstance))
|
if (!Ctl3dRegister(wxhInstance))
|
||||||
wxFatalError("Cannot register CTL3D");
|
wxFatalError("Cannot register CTL3D");
|
||||||
|
|
||||||
Ctl3dAutoSubclass(wxhInstance);
|
Ctl3dAutoSubclass(wxhInstance);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
g_globalCursor = new wxCursor;
|
g_globalCursor = new wxCursor;
|
||||||
|
|
||||||
@@ -195,18 +197,19 @@ bool wxApp::Initialize()
|
|||||||
wxDisableButtonBrush = ::CreateBrushIndirect( & lb ) ;
|
wxDisableButtonBrush = ::CreateBrushIndirect( & lb ) ;
|
||||||
::DeleteObject( (HGDIOBJ)lb.lbHatch ) ;
|
::DeleteObject( (HGDIOBJ)lb.lbHatch ) ;
|
||||||
|
|
||||||
#if USE_PENWINDOWS
|
#if USE_PENWINDOWS
|
||||||
wxRegisterPenWin();
|
wxRegisterPenWin();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxWinHandleList = new wxList(wxKEY_INTEGER);
|
wxWinHandleList = new wxList(wxKEY_INTEGER);
|
||||||
|
|
||||||
// This is to foil optimizations in Visual C++ that
|
// This is to foil optimizations in Visual C++ that
|
||||||
// throw out dummy.obj.
|
// throw out dummy.obj.
|
||||||
#if (_MSC_VER >= 800) && !defined(WXMAKINGDLL)
|
#if (_MSC_VER >= 800) && !defined(WXMAKINGDLL)
|
||||||
extern char wxDummyChar;
|
extern char wxDummyChar;
|
||||||
if (wxDummyChar) wxDummyChar++;
|
if (wxDummyChar) wxDummyChar++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxSetKeyboardHook(TRUE);
|
wxSetKeyboardHook(TRUE);
|
||||||
|
|
||||||
wxModule::RegisterModules();
|
wxModule::RegisterModules();
|
||||||
@@ -262,7 +265,7 @@ bool wxApp::RegisterWindowClasses()
|
|||||||
if (!RegisterClass( &wndclass1 ))
|
if (!RegisterClass( &wndclass1 ))
|
||||||
{
|
{
|
||||||
// wxFatalError("Can't register MDI Frame window class");
|
// wxFatalError("Can't register MDI Frame window class");
|
||||||
// return FALSE;
|
// return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
@@ -343,17 +346,15 @@ bool wxApp::RegisterWindowClasses()
|
|||||||
|
|
||||||
//// Convert Windows to argc, argv style
|
//// Convert Windows to argc, argv style
|
||||||
|
|
||||||
|
// FIXME this code should be rewritten (use wxArrayString instead...)
|
||||||
void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine)
|
void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine)
|
||||||
{
|
{
|
||||||
// Split command line into tokens, as in usual main(argc, argv)
|
// Split command line into tokens, as in usual main(argc, argv)
|
||||||
char **command = new char*[50];
|
char **command = new char*[50]; // VZ: sure? why not 25 or 73 and a half??
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
char *buf = new char[strlen(lpCmdLine) + 1];
|
char *buf = new char[strlen(lpCmdLine) + 1];
|
||||||
|
|
||||||
// Hangs around until end of app. in case
|
|
||||||
// user carries pointers to the tokens
|
|
||||||
|
|
||||||
/* Model independent strcpy */
|
/* Model independent strcpy */
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; (buf[i] = lpCmdLine[i]) != 0; i++)
|
for (i = 0; (buf[i] = lpCmdLine[i]) != 0; i++)
|
||||||
@@ -362,8 +363,8 @@ void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get application name
|
// Get application name
|
||||||
char name[200];
|
char name[260]; // 260 is MAX_PATH value from windef.h
|
||||||
::GetModuleFileName(wxhInstance, name, 199);
|
::GetModuleFileName(wxhInstance, name, WXSIZEOF(name));
|
||||||
|
|
||||||
// Is it only 16-bit Borland that already copies the program name
|
// Is it only 16-bit Borland that already copies the program name
|
||||||
// to the first argv index?
|
// to the first argv index?
|
||||||
@@ -379,33 +380,48 @@ void wxApp::ConvertToStandardCommandArgs(char* lpCmdLine)
|
|||||||
|
|
||||||
/* Break up string */
|
/* Break up string */
|
||||||
// Treat strings enclosed in double-quotes as single arguments
|
// Treat strings enclosed in double-quotes as single arguments
|
||||||
char* str = buf;
|
char* str = buf;
|
||||||
while (*str)
|
while (*str)
|
||||||
{
|
{
|
||||||
while (*str && *str <= ' ') str++; // skip whitespace
|
if ( count == WXSIZEOF(command) )
|
||||||
if (*str == '"')
|
{
|
||||||
{
|
wxFAIL_MSG("too many command line args.");
|
||||||
str++;
|
break;
|
||||||
command[count++] = str;
|
}
|
||||||
while (*str && *str != '"') str++;
|
|
||||||
}
|
|
||||||
else if (*str)
|
|
||||||
{
|
|
||||||
command[count++] = str;
|
|
||||||
while (*str && *str > ' ') str++;
|
|
||||||
}
|
|
||||||
if (*str) *str++ = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
wxTheApp->argv = new char*[argc+1];
|
while ( *str && isspace(*str) ) // skip whitespace
|
||||||
|
str++;
|
||||||
|
|
||||||
|
if (*str == '"')
|
||||||
|
{
|
||||||
|
str++;
|
||||||
|
command[count++] = str;
|
||||||
|
while (*str && *str != '"')
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
else if (*str)
|
||||||
|
{
|
||||||
|
command[count++] = str;
|
||||||
|
while (*str && !isspace(*str))
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
if (*str)
|
||||||
|
*str++ = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTheApp->argv = new char*[count + 1];
|
||||||
wxTheApp->argv[count] = NULL; /* argv[] is NULL terminated list! */
|
wxTheApp->argv[count] = NULL; /* argv[] is NULL terminated list! */
|
||||||
wxTheApp->argc = count;
|
wxTheApp->argc = count;
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
wxTheApp->argv[i] = copystring(command[i]);
|
wxTheApp->argv[i] = copystring(command[i]);
|
||||||
|
|
||||||
|
delete [] command[i];
|
||||||
}
|
}
|
||||||
delete[] buf;
|
|
||||||
|
delete [] command;
|
||||||
|
delete [] buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
//// Cleans up any wxWindows internal structures left lying around
|
//// Cleans up any wxWindows internal structures left lying around
|
||||||
@@ -498,34 +514,36 @@ void wxApp::CleanUp()
|
|||||||
#if !defined(_WINDLL) || (defined(_WINDLL) && defined(WXMAKINGDLL))
|
#if !defined(_WINDLL) || (defined(_WINDLL) && defined(WXMAKINGDLL))
|
||||||
|
|
||||||
//// Main wxWindows entry point
|
//// Main wxWindows entry point
|
||||||
|
int wxEntry(WXHINSTANCE hInstance,
|
||||||
int wxEntry(WXHINSTANCE hInstance, WXHINSTANCE WXUNUSED(hPrevInstance), char *lpCmdLine,
|
WXHINSTANCE WXUNUSED(hPrevInstance),
|
||||||
int nCmdShow, bool enterLoop)
|
char *lpCmdLine,
|
||||||
|
int nCmdShow,
|
||||||
|
bool enterLoop)
|
||||||
{
|
{
|
||||||
|
#ifndef __WXDEBUG__ // take everything into a try-except block in release build
|
||||||
|
__try {
|
||||||
|
#endif
|
||||||
|
|
||||||
wxhInstance = (HINSTANCE) hInstance;
|
wxhInstance = (HINSTANCE) hInstance;
|
||||||
|
|
||||||
if (!wxApp::Initialize())
|
if (!wxApp::Initialize())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// The app may have declared a global application object, but we recommend
|
// create the application object or ensure that one already exists
|
||||||
// the IMPLEMENT_APP macro is used instead, which sets an initializer function
|
|
||||||
// for delayed, dynamic app object construction.
|
|
||||||
if (!wxTheApp)
|
if (!wxTheApp)
|
||||||
{
|
{
|
||||||
if (!wxApp::GetInitializerFunction())
|
// The app may have declared a global application object, but we recommend
|
||||||
{
|
// the IMPLEMENT_APP macro is used instead, which sets an initializer
|
||||||
MessageBox(NULL, "No initializer - use IMPLEMENT_APP macro.", "wxWindows Error", MB_APPLMODAL | MB_ICONSTOP | MB_OK);
|
// function for delayed, dynamic app object construction.
|
||||||
return 0;
|
wxCHECK_MSG( wxApp::GetInitializerFunction(), 0,
|
||||||
}
|
"No initializer - use IMPLEMENT_APP macro." );
|
||||||
|
|
||||||
wxTheApp = (* wxApp::GetInitializerFunction()) ();
|
wxTheApp = (*wxApp::GetInitializerFunction()) ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wxTheApp) {
|
wxCHECK_MSG( wxTheApp, 0, "You have to define an instance of wxApp!" );
|
||||||
MessageBox(NULL, "You have to define an instance of wxApp!", "wxWindows Error", MB_APPLMODAL | MB_ICONSTOP | MB_OK);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// save the WinMain() parameters
|
||||||
wxTheApp->ConvertToStandardCommandArgs(lpCmdLine);
|
wxTheApp->ConvertToStandardCommandArgs(lpCmdLine);
|
||||||
wxTheApp->m_nCmdShow = nCmdShow;
|
wxTheApp->m_nCmdShow = nCmdShow;
|
||||||
|
|
||||||
@@ -533,46 +551,32 @@ int wxEntry(WXHINSTANCE hInstance, WXHINSTANCE WXUNUSED(hPrevInstance), char *lp
|
|||||||
// but this call is provided for compatibility across platforms.
|
// but this call is provided for compatibility across platforms.
|
||||||
wxTheApp->OnInitGui() ;
|
wxTheApp->OnInitGui() ;
|
||||||
|
|
||||||
if (!wxTheApp->OnInit())
|
int retValue = 0;
|
||||||
|
|
||||||
|
if ( wxTheApp->OnInit() )
|
||||||
{
|
{
|
||||||
wxTheApp->DeletePendingObjects();
|
if ( enterLoop )
|
||||||
wxTheApp->OnExit();
|
{
|
||||||
wxApp::CleanUp();
|
retValue = wxTheApp->OnRun();
|
||||||
|
}
|
||||||
delete wxTheApp;
|
|
||||||
wxTheApp = NULL;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
//else: app initialization failed, so we skipped OnRun()
|
||||||
|
|
||||||
if (!enterLoop)
|
wxWindow *topWindow = wxTheApp->GetTopWindow();
|
||||||
return 0;
|
if ( topWindow )
|
||||||
|
|
||||||
int retValue = 1;
|
|
||||||
|
|
||||||
/* New behaviour - leave it to the app to show the top window
|
|
||||||
if (wxTheApp->GetTopWindow()) {
|
|
||||||
// show the toplevel frame, only if we are not iconized (from MS-Windows)
|
|
||||||
if(wxTheApp->GetShowFrameOnInit() && (nCmdShow!=SW_HIDE)) wxTheApp->GetTopWindow()->Show(TRUE);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
retValue = wxTheApp->OnRun();
|
|
||||||
|
|
||||||
if (wxTheApp->GetTopWindow())
|
|
||||||
{
|
{
|
||||||
// Forcibly delete the window.
|
// Forcibly delete the window.
|
||||||
if (wxTheApp->GetTopWindow()->IsKindOf(CLASSINFO(wxFrame)) ||
|
if ( topWindow->IsKindOf(CLASSINFO(wxFrame)) ||
|
||||||
wxTheApp->GetTopWindow()->IsKindOf(CLASSINFO(wxDialog)))
|
topWindow->IsKindOf(CLASSINFO(wxDialog)) )
|
||||||
{
|
{
|
||||||
wxTheApp->GetTopWindow()->Close(TRUE);
|
topWindow->Close(TRUE);
|
||||||
wxTheApp->DeletePendingObjects();
|
wxTheApp->DeletePendingObjects();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
delete wxTheApp->GetTopWindow();
|
delete topWindow;
|
||||||
wxTheApp->SetTopWindow(NULL);
|
wxTheApp->SetTopWindow(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wxTheApp->OnExit();
|
wxTheApp->OnExit();
|
||||||
@@ -588,14 +592,25 @@ int wxEntry(WXHINSTANCE hInstance, WXHINSTANCE WXUNUSED(hPrevInstance), char *lp
|
|||||||
// wxDebugContext, too.
|
// wxDebugContext, too.
|
||||||
if (wxDebugContext::CountObjectsLeft() > 0)
|
if (wxDebugContext::CountObjectsLeft() > 0)
|
||||||
{
|
{
|
||||||
wxTrace("There were memory leaks.\n");
|
wxTrace("There were memory leaks.\n");
|
||||||
wxDebugContext::Dump();
|
wxDebugContext::Dump();
|
||||||
wxDebugContext::PrintStatistics();
|
wxDebugContext::PrintStatistics();
|
||||||
}
|
}
|
||||||
wxDebugContext::SetStream(NULL, NULL);
|
wxDebugContext::SetStream(NULL, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return retValue;
|
return retValue;
|
||||||
|
#ifndef __WXDEBUG__ // catch exceptions only in release build
|
||||||
|
}
|
||||||
|
__except ( EXCEPTION_EXECUTE_HANDLER ) {
|
||||||
|
/*
|
||||||
|
if ( wxTheApp )
|
||||||
|
wxTheApp->OnFatalException();
|
||||||
|
*/
|
||||||
|
|
||||||
|
::ExitProcess(3); // the same exit code as abort()
|
||||||
|
}
|
||||||
|
#endif //debug
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* _WINDLL */
|
#else /* _WINDLL */
|
||||||
@@ -613,13 +628,13 @@ int wxEntry(WXHINSTANCE hInstance)
|
|||||||
|
|
||||||
if (!wxTheApp)
|
if (!wxTheApp)
|
||||||
{
|
{
|
||||||
if (!wxApp::GetInitializerFunction())
|
if (!wxApp::GetInitializerFunction())
|
||||||
{
|
{
|
||||||
MessageBox(NULL, "No initializer - use IMPLEMENT_APP macro.", "wxWindows Error", MB_APPLMODAL | MB_ICONSTOP | MB_OK);
|
MessageBox(NULL, "No initializer - use IMPLEMENT_APP macro.", "wxWindows Error", MB_APPLMODAL | MB_ICONSTOP | MB_OK);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxTheApp = (* wxApp::GetInitializerFunction()) ();
|
wxTheApp = (* wxApp::GetInitializerFunction()) ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wxTheApp) {
|
if (!wxTheApp) {
|
||||||
@@ -832,40 +847,40 @@ void wxApp::OnIdle(wxIdleEvent& event)
|
|||||||
bool wxApp::SendIdleEvents()
|
bool wxApp::SendIdleEvents()
|
||||||
{
|
{
|
||||||
bool needMore = FALSE;
|
bool needMore = FALSE;
|
||||||
wxNode* node = wxTopLevelWindows.First();
|
wxNode* node = wxTopLevelWindows.First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxWindow* win = (wxWindow*) node->Data();
|
wxWindow* win = (wxWindow*) node->Data();
|
||||||
if (SendIdleEvents(win))
|
if (SendIdleEvents(win))
|
||||||
needMore = TRUE;
|
needMore = TRUE;
|
||||||
|
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
}
|
}
|
||||||
return needMore;
|
return needMore;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send idle event to window and all subwindows
|
// Send idle event to window and all subwindows
|
||||||
bool wxApp::SendIdleEvents(wxWindow* win)
|
bool wxApp::SendIdleEvents(wxWindow* win)
|
||||||
{
|
{
|
||||||
bool needMore = FALSE;
|
bool needMore = FALSE;
|
||||||
|
|
||||||
wxIdleEvent event;
|
wxIdleEvent event;
|
||||||
event.SetEventObject(win);
|
event.SetEventObject(win);
|
||||||
win->ProcessEvent(event);
|
win->ProcessEvent(event);
|
||||||
|
|
||||||
if (event.MoreRequested())
|
if (event.MoreRequested())
|
||||||
needMore = TRUE;
|
needMore = TRUE;
|
||||||
|
|
||||||
wxNode* node = win->GetChildren()->First();
|
wxNode* node = win->GetChildren()->First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxWindow* win = (wxWindow*) node->Data();
|
wxWindow* win = (wxWindow*) node->Data();
|
||||||
if (SendIdleEvents(win))
|
if (SendIdleEvents(win))
|
||||||
needMore = TRUE;
|
needMore = TRUE;
|
||||||
|
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
}
|
}
|
||||||
return needMore ;
|
return needMore ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxApp::DeletePendingObjects()
|
void wxApp::DeletePendingObjects()
|
||||||
@@ -915,30 +930,30 @@ int wxApp::GetComCtl32Version() const
|
|||||||
|
|
||||||
if (! theProc)
|
if (! theProc)
|
||||||
{ // not found, must be 4.00
|
{ // not found, must be 4.00
|
||||||
version = 400;
|
version = 400;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// The following symbol are unique to 4.71
|
// The following symbol are unique to 4.71
|
||||||
// DllInstall
|
// DllInstall
|
||||||
// FlatSB_EnableScrollBar FlatSB_GetScrollInfo FlatSB_GetScrollPos
|
// FlatSB_EnableScrollBar FlatSB_GetScrollInfo FlatSB_GetScrollPos
|
||||||
// FlatSB_GetScrollProp FlatSB_GetScrollRange FlatSB_SetScrollInfo
|
// FlatSB_GetScrollProp FlatSB_GetScrollRange FlatSB_SetScrollInfo
|
||||||
// FlatSB_SetScrollPos FlatSB_SetScrollProp FlatSB_SetScrollRange
|
// FlatSB_SetScrollPos FlatSB_SetScrollProp FlatSB_SetScrollRange
|
||||||
// FlatSB_ShowScrollBar
|
// FlatSB_ShowScrollBar
|
||||||
// _DrawIndirectImageList _DuplicateImageList
|
// _DrawIndirectImageList _DuplicateImageList
|
||||||
// InitializeFlatSB
|
// InitializeFlatSB
|
||||||
// UninitializeFlatSB
|
// UninitializeFlatSB
|
||||||
// we could check for any of these - I chose DllInstall
|
// we could check for any of these - I chose DllInstall
|
||||||
FARPROC theProc = ::GetProcAddress(theModule, "DllInstall");
|
FARPROC theProc = ::GetProcAddress(theModule, "DllInstall");
|
||||||
if (! theProc)
|
if (! theProc)
|
||||||
{
|
{
|
||||||
// not found, must be 4.70
|
// not found, must be 4.70
|
||||||
version = 470;
|
version = 470;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // found, must be 4.71
|
{ // found, must be 4.71
|
||||||
version = 471;
|
version = 471;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return version;
|
return version;
|
||||||
@@ -967,12 +982,11 @@ bool wxYield()
|
|||||||
|
|
||||||
HINSTANCE wxGetInstance()
|
HINSTANCE wxGetInstance()
|
||||||
{
|
{
|
||||||
return wxhInstance;
|
return wxhInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For some reason, with MSVC++ 1.5, WinMain isn't linked in properly
|
// For some reason, with MSVC++ 1.5, WinMain isn't linked in properly
|
||||||
// if in a separate file. So include it here to ensure it's linked.
|
// if in a separate file. So include it here to ensure it's linked.
|
||||||
#if (defined(_MSC_VER) && !defined(__WIN32__)) || defined(__GNUWIN32__)
|
#if (defined(_MSC_VER) && !defined(__WIN32__)) || defined(__GNUWIN32__)
|
||||||
#include "main.cpp"
|
#include "main.cpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user