git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22933 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
191 lines
5.0 KiB
C++
191 lines
5.0 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: msw/main.cpp
|
|
// Purpose: WinMain/DllMain
|
|
// Author: Julian Smart
|
|
// Modified by:
|
|
// Created: 04/01/98
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) Julian Smart
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ============================================================================
|
|
// 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
|
|
#endif
|
|
|
|
#include "wx/event.h"
|
|
#include "wx/app.h"
|
|
#include "wx/cmdline.h"
|
|
|
|
#include "wx/msw/private.h"
|
|
|
|
// Don't implement WinMain if we're building an MFC/wxWindows hybrid app.
|
|
#if wxUSE_MFC && !defined(NOMAIN)
|
|
#define NOMAIN 1
|
|
#endif
|
|
|
|
#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
|
|
|
|
#if defined(__WXMICROWIN__)
|
|
#define HINSTANCE HANDLE
|
|
#endif
|
|
|
|
#if wxUSE_GUI
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// function prototypes
|
|
// ----------------------------------------------------------------------------
|
|
|
|
static wxChar **ConvertToStandardCommandArgs(const wxChar *p, int& argc);
|
|
|
|
// ============================================================================
|
|
// implementation: various entry points
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Windows-specific wxEntry
|
|
// ----------------------------------------------------------------------------
|
|
|
|
WXDLLEXPORT int wxEntry(HINSTANCE hInstance,
|
|
HINSTANCE WXUNUSED(hPrevInstance),
|
|
char *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);
|
|
|
|
return wxEntry(argc, argv);
|
|
}
|
|
|
|
// 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 wxWindows.
|
|
|
|
#if defined(_WINDLL)
|
|
|
|
// DLL entry point
|
|
|
|
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 wxWindows 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:
|
|
return wxEntry(hModule);
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
wxEntryCleanup();
|
|
break;
|
|
}
|
|
#else
|
|
(void)hModule;
|
|
(void)fdwReason;
|
|
#endif // !WXMAKINGDLL
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#endif // _WINDLL
|
|
|
|
} // extern "C"
|
|
|
|
#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
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// global HINSTANCE
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#if wxUSE_BASE
|
|
|
|
HINSTANCE wxhInstance = 0;
|
|
|
|
HINSTANCE wxGetInstance()
|
|
{
|
|
return wxhInstance;
|
|
}
|
|
|
|
void wxSetInstance(HINSTANCE hInst)
|
|
{
|
|
wxhInstance = hInst;
|
|
}
|
|
|
|
#endif // wxUSE_BASE
|
|
|