X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4286a5b59579f09c014fd81683732cd8609cfe9f..e5d4ef7410d597bdf6d426ceedc656dbefd69e90:/src/msw/main.cpp diff --git a/src/msw/main.cpp b/src/msw/main.cpp index 3565e7fa23..a8bee7283b 100644 --- a/src/msw/main.cpp +++ b/src/msw/main.cpp @@ -1,102 +1,169 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: main.cpp -// Purpose: Main/DllMain +// Name: msw/main.cpp +// Purpose: WinMain/DllMain // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) + #pragma implementation #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #include "wx/event.h" #include "wx/app.h" -#include +#include "wx/cmdline.h" -// May wish not to have a DllMain or WinMain, e.g. if we're programming -// a Netscape plugin. -#ifndef NOMAIN +#include "wx/msw/private.h" -// NT defines APIENTRY, 3.x not -#if !defined(APIENTRY) -#define APIENTRY FAR PASCAL +#ifdef __BORLANDC__ + // BC++ has to be special: its run-time expects the DLL entry point to be + // named DllEntryPoint instead of the (more) standard DllMain + #define DllMain DllEntryPoint #endif -///////////////////////////////////////////////////////////////////////////////// -// WinMain -// Note that WinMain is also defined in dummy.obj, which is linked to -// an application that is using the DLL version of wxWindows. - -#if !defined(_WINDLL) +#if defined(__WXMICROWIN__) + #define HINSTANCE HANDLE +#endif -#if defined(__TWIN32__) || defined(__WXWINE__) +#if wxUSE_GUI -extern "C" -BOOL PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) +// ============================================================================ +// implementation: various entry points +// ============================================================================ -#else +// ---------------------------------------------------------------------------- +// Windows-specific wxEntry +// ---------------------------------------------------------------------------- -#ifdef __WATCOMC__ -int PASCAL -#else -int APIENTRY +WXDLLEXPORT int wxEntry(HINSTANCE hInstance, + HINSTANCE WXUNUSED(hPrevInstance), + wxCmdLineArgType WXUNUSED(pCmdLine), + int nCmdShow) +{ + // remember the parameters Windows gave us + wxSetInstance(hInstance); + wxApp::m_nCmdShow = nCmdShow; + + // 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); + } + +#ifdef __WXWINCE__ + // WinCE doesn't insert the program itself, so do it ourselves. + args.Insert(wxGetFullModuleName(), 0); #endif - WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) -#endif -// __TWIN32__ + int argc = args.GetCount(); -{ - return wxEntry((WXHINSTANCE) hInstance, (WXHINSTANCE) hPrevInstance, lpCmdLine, nCmdShow); + // +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); } -#endif -///////////////////////////////////////////////////////////////////////////////// -// DllMain +// 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 !defined(NOMAIN) + +extern "C" +{ + +// ---------------------------------------------------------------------------- +// WinMain +// ---------------------------------------------------------------------------- + +// Note that WinMain is also defined in dummy.obj, which is linked to +// an application that is using the DLL version of wxWidgets. #if defined(_WINDLL) // DLL entry point -extern "C" -#ifdef __BORLANDC__ -// SCD: I don't know why, but also OWL uses this function -BOOL WINAPI DllEntryPoint (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) -#else -BOOL WINAPI DllMain (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) -#endif +BOOL WINAPI +DllMain(HANDLE hModule, DWORD fdwReason, LPVOID WXUNUSED(lpReserved)) { + // Only call wxEntry if the application itself is part of the DLL. + // If only the wxWidgets library is in the DLL, then the + // initialisation will be called when the application implicitly + // calls WinMain. +#ifndef WXMAKINGDLL switch (fdwReason) - { - case DLL_PROCESS_ATTACH: - // Only call wxEntry if the application itself is part of the DLL. - // If only the wxWindows library is in the DLL, then the initialisation - // will be called when the application implicitly calls WinMain. - -#if !defined(WXMAKINGDLL) - return wxEntry((WXHINSTANCE) hModule); -#endif - break; + { + case DLL_PROCESS_ATTACH: + return wxEntry(hModule); + + case DLL_PROCESS_DETACH: + wxEntryCleanup(); + break; + } +#else + (void)hModule; + (void)fdwReason; +#endif // !WXMAKINGDLL - case DLL_PROCESS_DETACH: - default: - break; - } - return TRUE; + return TRUE; } -#endif +#endif // _WINDLL -#endif +} // extern "C" + +#endif // !NOMAIN + +#endif // wxUSE_GUI + +// ---------------------------------------------------------------------------- +// global HINSTANCE +// ---------------------------------------------------------------------------- + +#if wxUSE_BASE + +HINSTANCE wxhInstance = 0; + +HINSTANCE wxGetInstance() +{ + return wxhInstance; +} + +void wxSetInstance(HINSTANCE hInst) +{ + wxhInstance = hInst; +} + +#endif // wxUSE_BASE