added wxMSW-specific wxEntryStart() overload taking WinMain-like parameters

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46203 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-05-25 00:52:00 +00:00
parent 4dfbedd3f5
commit d76a558d4d
3 changed files with 80 additions and 25 deletions

View File

@@ -435,6 +435,15 @@ least the GUI part of) the library can't be used at all.
Notice that parameters \arg{argc} and \arg{argv} may be modified by this
function.
An additional overload of wxEntryStart() is provided under MSW only: it is
meant to be called with the parameters passed to \texttt{WinMain()}.
\func{bool}{wxEntryStart}{\param{HINSTANCE }{hInstance}, \param{HINSTANCE }{hPrevInstance = \NULL}, \param{char *}{pCmdLine = \NULL}, \param{int }{nCmdShow = \texttt{SW\_SHOWNORMAL}}}
(notice that under Windows CE platform, and only there, the type of
\arg{pCmdLine} is \texttt{wchar\_t *}, otherwise it is \texttt{char *}, even in
Unicode build).
\wxheading{Include files}
<wx/init.h>

View File

@@ -96,6 +96,14 @@ protected:
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 bool WXDLLEXPORT
wxEntryStart(HINSTANCE hInstance,
HINSTANCE hPrevInstance = NULL,
wxCmdLineArgType pCmdLine = NULL,
int nCmdShow = SW_SHOWNORMAL);
extern int WXDLLEXPORT
wxEntry(HINSTANCE hInstance,
HINSTANCE hPrevInstance = NULL,

View File

@@ -61,6 +61,7 @@
// defined in common/init.cpp
extern int wxEntryReal(int& argc, wxChar **argv);
extern int wxEntryCleanupReal(int& argc, wxChar **argv);
// ============================================================================
// implementation: various entry points
@@ -319,31 +320,56 @@ static bool wxIsUnicodeAvailable()
// Windows-specific wxEntry
// ----------------------------------------------------------------------------
// helper function used to clean up in wxEntry() just below
//
// notice that argv elements are supposed to be allocated using malloc() while
// argv array itself is allocated with new
static void wxFreeArgs(int argc, wxChar **argv)
struct wxMSWCommandLineArguments
{
wxMSWCommandLineArguments() { argc = 0; argv = NULL; }
void Init(const wxArrayString& args)
{
argc = args.size();
// +1 here for the terminating NULL
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;
}
void Free()
{
if ( !argc )
return;
for ( int i = 0; i < argc; i++ )
{
free(argv[i]);
}
delete [] argv;
}
argv = NULL;
argc = 0;
}
WXDLLEXPORT int wxEntry(HINSTANCE hInstance,
HINSTANCE WXUNUSED(hPrevInstance),
wxCmdLineArgType WXUNUSED(pCmdLine),
int nCmdShow)
int argc;
wxChar **argv;
};
static wxMSWCommandLineArguments wxArgs;
// common part of wxMSW-specific wxEntryStart() and wxEntry() overloads
static bool
wxMSWEntryCommon(HINSTANCE hInstance, int nCmdShow)
{
// the first thing to do is to check if we're trying to run an Unicode
// program under Win9x w/o MSLU emulation layer - if so, abort right now
// as it has no chance to work and has all chances to crash
#ifdef NEED_UNICODE_CHECK
if ( !wxIsUnicodeAvailable() )
return -1;
return false;
#endif // NEED_UNICODE_CHECK
@@ -369,21 +395,33 @@ WXDLLEXPORT int wxEntry(HINSTANCE hInstance,
args.Insert(wxGetFullModuleName(), 0);
#endif
int argc = args.GetCount();
wxArgs.Init(args);
// +1 here for the terminating NULL
wxChar **argv = new wxChar *[argc + 1];
for ( int i = 0; i < argc; i++ )
{
argv[i] = wxStrdup(args[i]);
}
return true;
}
// argv[] must be NULL-terminated
argv[argc] = NULL;
WXDLLEXPORT bool wxEntryStart(HINSTANCE hInstance,
HINSTANCE WXUNUSED(hPrevInstance),
wxCmdLineArgType WXUNUSED(pCmdLine),
int nCmdShow)
{
if ( !wxMSWEntryCommon(hInstance, nCmdShow) )
return false;
wxON_BLOCK_EXIT2(wxFreeArgs, argc, argv);
return wxEntryStart(wxArgs.argc, wxArgs.argv);
}
return wxEntry(argc, argv);
WXDLLEXPORT int wxEntry(HINSTANCE hInstance,
HINSTANCE WXUNUSED(hPrevInstance),
wxCmdLineArgType WXUNUSED(pCmdLine),
int nCmdShow)
{
if ( !wxMSWEntryCommon(hInstance, nCmdShow) )
return -1;
wxON_BLOCK_EXIT_OBJ0(wxArgs, wxMSWCommandLineArguments::Free);
return wxEntry(wxArgs.argc, wxArgs.argv);
}
#endif // wxUSE_GUI && __WXMSW__