From 26cdd42d2cbd99d23159ae4b4d41ae93ed23317c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 30 Jun 2012 16:33:28 +0000 Subject: [PATCH] Define wxEntry() with WinMain-compatible signature for all Windows ports. Make wxEntry(HINSTANCE, ...) available in wxGTK under Windows too. Refactor the headers to allow this and extract Windows-specific wxEntry() declarations in wx/msw/init.h from wx/msw/app.h for consistency with the normal wxEntry(int, char**) declared in wx/init.h. Closes #14423. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71890 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 2 + build/bakefiles/files.bkl | 1 + build/msw/wx_core.dsp | 4 ++ build/msw/wx_vc7_core.vcproj | 3 ++ build/msw/wx_vc8_core.vcproj | 4 ++ build/msw/wx_vc9_core.vcproj | 4 ++ include/wx/init.h | 6 +++ include/wx/msw/app.h | 76 ------------------------------ include/wx/msw/init.h | 91 ++++++++++++++++++++++++++++++++++++ src/msw/main.cpp | 6 ++- 10 files changed, 119 insertions(+), 78 deletions(-) create mode 100644 include/wx/msw/init.h diff --git a/Makefile.in b/Makefile.in index ee7c24d09d..9b511cb50e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -3001,6 +3001,7 @@ COND_TOOLKIT_MSW_GUI_HDR = \ wx/msw/icon.h \ wx/msw/imaglist.h \ wx/msw/iniconf.h \ + wx/msw/init.h \ wx/msw/listbox.h \ wx/msw/listctrl.h \ wx/msw/mdi.h \ @@ -3520,6 +3521,7 @@ COND_TOOLKIT_WINCE_GUI_HDR = \ wx/msw/icon.h \ wx/msw/imaglist.h \ wx/msw/iniconf.h \ + wx/msw/init.h \ wx/msw/listbox.h \ wx/msw/listctrl.h \ wx/msw/mdi.h \ diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index bc29c0b76f..f0221ab6a9 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -1810,6 +1810,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/msw/icon.h wx/msw/imaglist.h wx/msw/iniconf.h + wx/msw/init.h wx/msw/listbox.h wx/msw/listctrl.h wx/msw/mdi.h diff --git a/build/msw/wx_core.dsp b/build/msw/wx_core.dsp index b56839c4f9..ea371852c7 100644 --- a/build/msw/wx_core.dsp +++ b/build/msw/wx_core.dsp @@ -5240,6 +5240,10 @@ SOURCE=..\..\include\wx\msw\iniconf.h # End Source File # Begin Source File +SOURCE=..\..\include\wx\msw\init.h +# End Source File +# Begin Source File + SOURCE=..\..\include\wx\msw\joystick.h # End Source File # Begin Source File diff --git a/build/msw/wx_vc7_core.vcproj b/build/msw/wx_vc7_core.vcproj index 3eddaa9b42..f77793111e 100644 --- a/build/msw/wx_vc7_core.vcproj +++ b/build/msw/wx_vc7_core.vcproj @@ -4502,6 +4502,9 @@ RelativePath="..\..\include\wx\msw\iniconf.h"> + + + + diff --git a/build/msw/wx_vc9_core.vcproj b/build/msw/wx_vc9_core.vcproj index 969b9ef7a6..eae3a09ac4 100644 --- a/build/msw/wx_vc9_core.vcproj +++ b/build/msw/wx_vc9_core.vcproj @@ -6020,6 +6020,10 @@ > + + diff --git a/include/wx/init.h b/include/wx/init.h index 90304ef918..974a5a7266 100644 --- a/include/wx/init.h +++ b/include/wx/init.h @@ -53,6 +53,12 @@ extern int WXDLLIMPEXP_BASE wxEntry(int& argc, char **argv); #endif// wxUSE_UNICODE +// Under Windows we define additional wxEntry() overloads with signature +// compatible with WinMain() and not the traditional main(). +#if wxUSE_GUI && defined(__WINDOWS__) + #include "wx/msw/init.h" +#endif + // ---------------------------------------------------------------------------- // Using the library without (explicit) application object: you may avoid using // wxDECLARE_APP and wxIMPLEMENT_APP macros and call the functions below instead at diff --git a/include/wx/msw/app.h b/include/wx/msw/app.h index 5c54441e85..70df2ce481 100644 --- a/include/wx/msw/app.h +++ b/include/wx/msw/app.h @@ -126,81 +126,5 @@ inline int wxApp::GetShell32Version() #endif // __WXWINCE__ -// ---------------------------------------------------------------------------- -// MSW-specific wxEntry() overload and wxIMPLEMENT_WXWIN_MAIN definition -// ---------------------------------------------------------------------------- - -// 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, under normal Windows -// but is always Unicode under CE -#ifdef __WXWINCE__ - typedef wchar_t *wxCmdLineArgType; -#else - typedef char *wxCmdLineArgType; -#endif - -// wxMSW-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 // _WX_APP_H_ diff --git a/include/wx/msw/init.h b/include/wx/msw/init.h new file mode 100644 index 0000000000..986d493f6c --- /dev/null +++ b/include/wx/msw/init.h @@ -0,0 +1,91 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/init.h +// Purpose: Windows-specific wxEntry() overload +// Author: Julian Smart +// Modified by: +// Created: 01/02/97 +// RCS-ID: $Id$ +// 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 +// ---------------------------------------------------------------------------- + +// 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, under normal Windows +// but is always Unicode under CE +#ifdef __WXWINCE__ + typedef wchar_t *wxCmdLineArgType; +#else + typedef char *wxCmdLineArgType; +#endif + +// 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 // _WX_MSW_INIT_H_ diff --git a/src/msw/main.cpp b/src/msw/main.cpp index d55fef241a..06cc6a4771 100644 --- a/src/msw/main.cpp +++ b/src/msw/main.cpp @@ -202,7 +202,7 @@ int wxEntry(int& argc, wxChar **argv) #endif // wxUSE_BASE -#if wxUSE_GUI && defined(__WXMSW__) +#if wxUSE_GUI namespace { @@ -358,7 +358,9 @@ wxMSWEntryCommon(HINSTANCE hInstance, int nCmdShow) // remember the parameters Windows gave us wxSetInstance(hInstance); +#ifdef __WXMSW__ wxApp::m_nCmdShow = nCmdShow; +#endif // 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 @@ -414,7 +416,7 @@ WXDLLEXPORT int wxEntry(HINSTANCE hInstance, return wxEntry(wxArgs.argc, wxArgs.argv); } -#endif // wxUSE_GUI && __WXMSW__ +#endif // wxUSE_GUI // ---------------------------------------------------------------------------- // global HINSTANCE -- 2.47.2