From b2b1371c97bddec2f6182d91cc37ae163a00b643 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 12 Feb 2004 18:42:39 +0000 Subject: [PATCH] set argc/argv properly in Unicode build (fixes bug 878002) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25774 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/main.cpp | 70 +++++++++++++++++------------------------------- 1 file changed, 24 insertions(+), 46 deletions(-) diff --git a/src/msw/main.cpp b/src/msw/main.cpp index 9f96ac237c..fd950861b2 100644 --- a/src/msw/main.cpp +++ b/src/msw/main.cpp @@ -51,12 +51,6 @@ #if wxUSE_GUI -// ---------------------------------------------------------------------------- -// function prototypes -// ---------------------------------------------------------------------------- - -static wxChar **ConvertToStandardCommandArgs(const wxChar *p, int& argc); - // ============================================================================ // implementation: various entry points // ============================================================================ @@ -67,16 +61,36 @@ static wxChar **ConvertToStandardCommandArgs(const wxChar *p, int& argc); WXDLLEXPORT int wxEntry(HINSTANCE hInstance, HINSTANCE WXUNUSED(hPrevInstance), - char *pCmdLine, + char * 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); } @@ -130,42 +144,6 @@ 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 // ---------------------------------------------------------------------------- -- 2.45.2