X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e2478fde622a16d25c66690af353dfdc37e7b582..4c3ebca927cea2742ec128c9c3ef3676d1ecae01:/src/msw/main.cpp diff --git a/src/msw/main.cpp b/src/msw/main.cpp index f5a6a4b22a..c293e7c511 100644 --- a/src/msw/main.cpp +++ b/src/msw/main.cpp @@ -30,6 +30,7 @@ #include "wx/event.h" #include "wx/app.h" +#include "wx/cmdline.h" #include "wx/msw/private.h" @@ -48,20 +49,41 @@ #define HINSTANCE HANDLE #endif +#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 // ============================================================================ +// ---------------------------------------------------------------------------- +// Windows-specific wxEntry +// ---------------------------------------------------------------------------- + +WXDLLEXPORT int wxEntry(HINSTANCE hInstance, + HINSTANCE WXUNUSED(hPrevInstance), + char *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); + + 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" { @@ -75,16 +97,23 @@ extern "C" #if !defined(_WINDLL) +#ifdef __WXWINCE__ +int WINAPI WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPWSTR lpCmdLine, + int nCmdShow) +{ + return wxEntry(hInstance, hPrevInstance, (char*) lpCmdLine, nCmdShow); +} +#else int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - return wxEntry((WXHINSTANCE) hInstance, - (WXHINSTANCE) hPrevInstance, - lpCmdLine, - nCmdShow); + return wxEntry(hInstance, hPrevInstance, lpCmdLine, nCmdShow); } +#endif #else // _WINDLL @@ -101,13 +130,11 @@ DllMain(HANDLE hModule, DWORD fdwReason, LPVOID WXUNUSED(lpReserved)) 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; @@ -123,11 +150,49 @@ DllMain(HANDLE hModule, DWORD fdwReason, LPVOID WXUNUSED(lpReserved)) #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]; + + // as we use wxStrdup below we must allocate the first argument using + // malloc(), not new[], as well + argv[0] = (wxChar *)malloc(MAX_PATH * sizeof(wxChar)); + ::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 + // ---------------------------------------------------------------------------- // global HINSTANCE // ---------------------------------------------------------------------------- -#ifdef __WXBASE__ +#if wxUSE_BASE HINSTANCE wxhInstance = 0; @@ -141,5 +206,5 @@ void wxSetInstance(HINSTANCE hInst) wxhInstance = hInst; } -#endif // __WXBASE__ +#endif // wxUSE_BASE