X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e2478fde622a16d25c66690af353dfdc37e7b582..52c3e064c7ecc5ae64022b58bfe31327af97a21d:/src/msw/main.cpp diff --git a/src/msw/main.cpp b/src/msw/main.cpp index f5a6a4b22a..5251f1f34d 100644 --- a/src/msw/main.cpp +++ b/src/msw/main.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation #endif @@ -30,14 +30,10 @@ #include "wx/event.h" #include "wx/app.h" +#include "wx/cmdline.h" #include "wx/msw/private.h" -// Don't implement WinMain if we're building an MFC/wxWindows hybrid app. -#if wxUSE_MFC && !defined(NOMAIN) - #define NOMAIN 1 -#endif - #ifdef __BORLANDC__ // BC++ has to be special: its run-time expects the DLL entry point to be // named DllEntryPoint instead of the (more) standard DllMain @@ -48,20 +44,61 @@ #define HINSTANCE HANDLE #endif -// ---------------------------------------------------------------------------- -// function prototypes -// ---------------------------------------------------------------------------- - -// from src/msw/app.cpp -extern void WXDLLEXPORT wxEntryCleanup(); +#if wxUSE_GUI // ============================================================================ // implementation: various entry points // ============================================================================ +// ---------------------------------------------------------------------------- +// Windows-specific wxEntry +// ---------------------------------------------------------------------------- + +WXDLLEXPORT int wxEntry(HINSTANCE hInstance, + HINSTANCE WXUNUSED(hPrevInstance), + wxCmdLineArgType WXUNUSED(pCmdLine), + int nCmdShow) +{ + // remember the parameters Windows gave us + wxSetInstance(hInstance); + wxApp::m_nCmdShow = nCmdShow; + + // parse the command line: we can't use pCmdLine in Unicode build so it is + // simpler to never use it at all (this also results in a more correct + // argv[0]) + + // break the command line in words + wxArrayString args; + + const wxChar *cmdLine = ::GetCommandLine(); + if ( cmdLine ) + { + args = wxCmdLineParser::ConvertStringToArgs(cmdLine); + } + +#ifdef __WXWINCE__ + // WinCE doesn't insert the program itself, so do it ourselves. + args.Insert(wxGetFullModuleName(), 0); +#endif + + int argc = args.GetCount(); + + // +1 here for the terminating NULL + wxChar **argv = new wxChar *[argc + 1]; + for ( int i = 0; i < argc; i++ ) + { + argv[i] = wxStrdup(args[i]); + } + + // argv[] must be NULL-terminated + argv[argc] = NULL; + + return wxEntry(argc, argv); +} + // May wish not to have a DllMain or WinMain, e.g. if we're programming // a Netscape plugin or if we're writing a console application -#if wxUSE_GUI && !defined(NOMAIN) +#if !defined(NOMAIN) extern "C" { @@ -71,22 +108,9 @@ extern "C" // ---------------------------------------------------------------------------- // Note that WinMain is also defined in dummy.obj, which is linked to -// an application that is using the DLL version of wxWindows. +// an application that is using the DLL version of wxWidgets. -#if !defined(_WINDLL) - -int PASCAL WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - return wxEntry((WXHINSTANCE) hInstance, - (WXHINSTANCE) hPrevInstance, - lpCmdLine, - nCmdShow); -} - -#else // _WINDLL +#if defined(_WINDLL) // DLL entry point @@ -94,44 +118,44 @@ BOOL WINAPI DllMain(HANDLE hModule, DWORD fdwReason, LPVOID WXUNUSED(lpReserved)) { // Only call wxEntry if the application itself is part of the DLL. - // If only the wxWindows library is in the DLL, then the + // If only the wxWidgets library is in the DLL, then the // initialisation will be called when the application implicitly // calls WinMain. #ifndef WXMAKINGDLL switch (fdwReason) { case DLL_PROCESS_ATTACH: - return wxEntry((WXHINSTANCE) hModule); + return wxEntry(hModule); case DLL_PROCESS_DETACH: - if ( wxTheApp ) - wxTheApp->OnExit(); - wxEntryCleanup(); - break; + wxEntryCleanup(); + break; } #else - (void)hModule; - (void)fdwReason; + (void)hModule; + (void)fdwReason; #endif // !WXMAKINGDLL return TRUE; } -#endif // _WINDLL/!_WINDLL +#endif // _WINDLL } // extern "C" #endif // !NOMAIN +#endif // wxUSE_GUI + // ---------------------------------------------------------------------------- // global HINSTANCE // ---------------------------------------------------------------------------- -#ifdef __WXBASE__ +#if wxUSE_BASE HINSTANCE wxhInstance = 0; -HINSTANCE wxGetInstance() +extern "C" HINSTANCE wxGetInstance() { return wxhInstance; } @@ -141,5 +165,5 @@ void wxSetInstance(HINSTANCE hInst) wxhInstance = hInst; } -#endif // __WXBASE__ +#endif // wxUSE_BASE