X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b3dfbbc91088ab32c3aae4294a3c726fadfc5ccd..020707bba9c960c155f4257d9a027d6aecdae5b8:/src/msw/main.cpp?ds=sidebyside diff --git a/src/msw/main.cpp b/src/msw/main.cpp index d53937131a..8f842b4b0f 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,12 +30,11 @@ #include "wx/event.h" #include "wx/app.h" -#include "wx/init.h" #include "wx/cmdline.h" #include "wx/msw/private.h" -// Don't implement WinMain if we're building an MFC/wxWindows hybrid app. +// Don't implement WinMain if we're building an MFC/wxWidgets hybrid app. #if wxUSE_MFC && !defined(NOMAIN) #define NOMAIN 1 #endif @@ -52,15 +51,6 @@ #if wxUSE_GUI -// ---------------------------------------------------------------------------- -// function prototypes -// ---------------------------------------------------------------------------- - -// from src/msw/app.cpp -extern void WXDLLEXPORT wxEntryCleanup(); - -static wxChar **ConvertToStandardCommandArgs(const wxChar *p, int& argc); - // ============================================================================ // implementation: various entry points // ============================================================================ @@ -71,16 +61,36 @@ static wxChar **ConvertToStandardCommandArgs(const wxChar *p, int& argc); WXDLLEXPORT int wxEntry(HINSTANCE hInstance, HINSTANCE WXUNUSED(hPrevInstance), - char *pCmdLine, + wxCmdLineArgType WXUNUSED(pCmdLine), int nCmdShow) { // remember the parameters Windows gave us wxSetInstance(hInstance); wxApp::m_nCmdShow = nCmdShow; - // parse the command line - int argc; - wxChar **argv = ConvertToStandardCommandArgs(wxConvertMB2WX(pCmdLine), argc); + // 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); + } + + 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); } @@ -97,19 +107,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. - -#if !defined(_WINDLL) +// an application that is using the DLL version of wxWidgets. -int PASCAL WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - return wxEntry(hInstance, hPrevInstance, lpCmdLine, nCmdShow); -} - -#else // _WINDLL +#if defined(_WINDLL) // DLL entry point @@ -117,7 +117,7 @@ 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 @@ -138,46 +138,12 @@ DllMain(HANDLE hModule, DWORD fdwReason, LPVOID WXUNUSED(lpReserved)) return TRUE; } -#endif // _WINDLL/!_WINDLL +#endif // _WINDLL } // extern "C" #endif // !NOMAIN -// --------------------------------------------------------------------------- -// Convert Windows to argc, argv style -// --------------------------------------------------------------------------- - -wxChar **ConvertToStandardCommandArgs(const wxChar *p, int& argc) -{ - // break the command line in words - wxArrayString args; - if ( p ) - { - args = wxCmdLineParser::ConvertStringToArgs(p); - } - - // +1 here for the program name - argc = args.GetCount() + 1; - - // and +1 here for the terminating NULL - wxChar **argv = new wxChar *[argc + 1]; - - argv[0] = new wxChar[MAX_PATH]; - ::GetModuleFileName(wxhInstance, argv[0], MAX_PATH); - - // copy all the other arguments to wxApp::argv[] - for ( int i = 1; i < argc; i++ ) - { - argv[i] = wxStrdup(args[i - 1]); - } - - // argv[] must be NULL-terminated - argv[argc] = NULL; - - return argv; -} - #endif // wxUSE_GUI // ----------------------------------------------------------------------------