5b74044c3e
While we use wmain() for the compilers that provide it since the changes of
bfa78c63b9
, we still didn't handle Unicode
command line arguments not representable in the current Windows code page
correctly when using other compilers (e.g. MinGW).
Now use Win32 ::GetCommandLine() function for them and parse the command line
ourselves instead of relying on non-Unicode-friendly main() arguments which
can't represent arbitrary Unicode strings when not using UTF-8 (which is never
the case under Windows).
95 lines
4.5 KiB
C
95 lines
4.5 KiB
C
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/msw/init.h
|
|
// Purpose: Windows-specific wxEntry() overload
|
|
// Author: Julian Smart
|
|
// Modified by:
|
|
// Created: 01/02/97
|
|
// Copyright: (c) Julian Smart
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_MSW_INIT_H_
|
|
#define _WX_MSW_INIT_H_
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Windows-specific wxEntry() overload and wxIMPLEMENT_WXWIN_MAIN definition
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxEntry() overload using the command line for the current process, instead
|
|
// of argc/argv provided by the CRT. This is only really useful when using
|
|
// Unicode with a compiler not providing wmain() or similar entry point, but is
|
|
// always provided for consistency.
|
|
extern int WXDLLIMPEXP_BASE wxEntry();
|
|
|
|
#if wxUSE_GUI
|
|
|
|
// we need HINSTANCE declaration to define WinMain()
|
|
#include "wx/msw/wrapwin.h"
|
|
|
|
#ifndef SW_SHOWNORMAL
|
|
#define SW_SHOWNORMAL 1
|
|
#endif
|
|
|
|
// WinMain() is always ANSI, even in Unicode build.
|
|
typedef char *wxCmdLineArgType;
|
|
|
|
// Windows-only overloads of wxEntry() and wxEntryStart() which take the
|
|
// parameters passed to WinMain() instead of those passed to main()
|
|
extern WXDLLIMPEXP_CORE bool
|
|
wxEntryStart(HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance = NULL,
|
|
wxCmdLineArgType pCmdLine = NULL,
|
|
int nCmdShow = SW_SHOWNORMAL);
|
|
|
|
extern WXDLLIMPEXP_CORE int
|
|
wxEntry(HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance = NULL,
|
|
wxCmdLineArgType pCmdLine = NULL,
|
|
int nCmdShow = SW_SHOWNORMAL);
|
|
|
|
#if defined(__BORLANDC__) && wxUSE_UNICODE
|
|
// Borland C++ has the following nonstandard behaviour: when the -WU
|
|
// command line flag is used, the linker expects to find wWinMain instead
|
|
// of WinMain. This flag causes the compiler to define _UNICODE and
|
|
// UNICODE symbols and there's no way to detect its use, so we have to
|
|
// define both WinMain and wWinMain so that wxIMPLEMENT_WXWIN_MAIN works
|
|
// for both code compiled with and without -WU.
|
|
// See http://sourceforge.net/tracker/?func=detail&atid=309863&aid=1935997&group_id=9863
|
|
// for more details.
|
|
#define wxIMPLEMENT_WXWIN_MAIN_BORLAND_NONSTANDARD \
|
|
extern "C" int WINAPI wWinMain(HINSTANCE hInstance, \
|
|
HINSTANCE hPrevInstance, \
|
|
wchar_t * WXUNUSED(lpCmdLine), \
|
|
int nCmdShow) \
|
|
{ \
|
|
wxDISABLE_DEBUG_SUPPORT(); \
|
|
\
|
|
/* NB: wxEntry expects lpCmdLine argument to be char*, not */ \
|
|
/* wchar_t*, but fortunately it's not used anywhere */ \
|
|
/* and we can simply pass NULL in: */ \
|
|
return wxEntry(hInstance, hPrevInstance, NULL, nCmdShow); \
|
|
}
|
|
#else
|
|
#define wxIMPLEMENT_WXWIN_MAIN_BORLAND_NONSTANDARD
|
|
#endif // defined(__BORLANDC__) && wxUSE_UNICODE
|
|
|
|
#define wxIMPLEMENT_WXWIN_MAIN \
|
|
extern "C" int WINAPI WinMain(HINSTANCE hInstance, \
|
|
HINSTANCE hPrevInstance, \
|
|
wxCmdLineArgType WXUNUSED(lpCmdLine), \
|
|
int nCmdShow) \
|
|
{ \
|
|
wxDISABLE_DEBUG_SUPPORT(); \
|
|
\
|
|
/* NB: We pass NULL in place of lpCmdLine to behave the same as */ \
|
|
/* Borland-specific wWinMain() above. If it becomes needed */ \
|
|
/* to pass lpCmdLine to wxEntry() here, you'll have to fix */ \
|
|
/* wWinMain() above too. */ \
|
|
return wxEntry(hInstance, hPrevInstance, NULL, nCmdShow); \
|
|
} \
|
|
wxIMPLEMENT_WXWIN_MAIN_BORLAND_NONSTANDARD
|
|
|
|
#endif // wxUSE_GUI
|
|
|
|
#endif // _WX_MSW_INIT_H_
|