Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

198 lines
7.4 KiB

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corp., 1991 **/
/**********************************************************************/
/*
bltapp.hxx
Simple application framework: definition
This class encapsulates the skeleton of a Windows application
and messageloop as a simple "application startup" object.
FILE HISTORY
beng 01-Apr-1991 Added to BLT
rustanl 17-Jun-1991 Added APPLICATION
rustanl 15-Jul-1991 Code review changes (no functional
differences). CR attended by
BenG, ChuckC, Hui-LiCh, TerryK, RustanL.
rustanl 29-Aug-1991 Virtualized Run
beng 14-Oct-1991 Removed APPSTART
beng 29-Jun-1992 DLLization delta
*/
#ifndef _BLT_HXX_
#error "Don't include this file directly; instead, include it through blt.hxx"
#endif // _BLT_HXX_
#ifndef _BLTAPP_HXX_
#define _BLTAPP_HXX_
#include <stdlib.h>
#include "base.hxx"
#include "bltpump.hxx"
/*************************************************************************
NAME: APPLICATION
SYNOPSIS: An application object: a thang that you run.
INTERFACE: APPLICATION() - Constructor
Initializes BLT and other common
subsystems that need to be initialized
during application start-up time.
~APPLICATION() - Destructor
Undoes what the constructor did
Run() - Runs the application
This method is called automatically
(by the SET_ROOT_OBJECT macro).
A subclass may replace Run, do some
second stage construction, call the
parent Run method, destroys things
set up in the second stage construction.
Run will not be called unless the object
constructed successfully, so the Run
method does not need to call QueryError.
QueryArgc() - Return # of args on command line
QueryArgv() - Return the tokenized command line
PARENT: BASE, HAS_MESSAGE_PUMP
NOTES:
The constructor, Run method, and destructor are all
accessible only to BltMain. SET_ROOT_OBJECT will handle
this for the application.
Currently ignores the Windows command line.
HISTORY:
rustanl 17-Jun-1991 Created
beng 08-Jul-1991 Accessible only to BltMain;
FilterMessage added
rustanl 29-Aug-1991 Virtualized Run
rustanl 04-Sep-1991 Added DisplayCtError
beng 07-Oct-1991 Uses HAS_MESSAGE_PUMP
beng 24-Apr-1992 More realistic command-line support
beng 03-Aug-1992 Add QueryInstance
**************************************************************************/
DLL_CLASS APPLICATION : public BASE, public HAS_MESSAGE_PUMP
{
friend INT BltMain(HINSTANCE hInst, INT nShow);
private:
HINSTANCE _hInstance;
BOOL _fMsgPopupIsInit;
VOID DisplayCtError( APIERR err );
protected:
APPLICATION( HINSTANCE hInstance, INT nCmdShow,
UINT nMinR, UINT nMaxR, UINT nMinS, UINT nMaxS );
~APPLICATION();
virtual INT Run();
public:
HINSTANCE QueryInstance() const
{ return _hInstance; }
static BOOL IsSystemInitialized( VOID );
// The runtime takes care of support for the following
// in DLLCLIENT vs APP situations.
#if 0
//#ifdef _DLL
static CHAR ** QueryArgv()
{ return * :: __argv_dll; }
static const UINT QueryArgc()
{ return * :: __argc_dll; }
#else
static CHAR ** QueryArgv()
{ return __argv; }
static const UINT QueryArgc()
{ return __argc; }
#endif /* _DLL */
};
/*******************************************************************
NAME: SET_ROOT_OBJECT
SYNOPSIS: Macro that allows a client to specify what class
describes the application. The macro will arrange
for the construction, execution, and destruction of
an instance of a particular type of APPLICATION.
ENTRY: root_obj_class_name - Name of class that describes
the application
CAVEATS: This macro sets up the app's WinMain.
Clients should not try to supply their own WinMain.
NOTES: This macro should be used exactly once in every
application.
Clients of APPLICATION may still set a breakpoint
at WinMain, generating a break before the application
really gets started.
HISTORY:
rustanl 17-Jun-1991 Created
beng 08-Jul-1991 Emits BltMain instead of WinMain
rustanl 29-Aug-1991 Virtualized Run
rustanl 04-Sep-1991 Make use of new DisplayCtError
beng 24-Apr-1992 Ignore Windows command line
beng 29-Jun-1992 DLLization delta (includes WinMain)
KeithMo 11-May-1993 Fail gracefully if USER32 not initialized.
********************************************************************/
#define SET_ROOT_OBJECT( root_class_name, idMinR, idMaxR, idMinS, idMaxS ) \
INT BltMain( HINSTANCE hInstance, INT nCmdShow ) \
{ \
if( !APPLICATION::IsSystemInitialized() ) \
{ \
return (INT)ERROR_ACCESS_DENIED; \
} \
root_class_name app( hInstance, nCmdShow, \
idMinR, idMaxR, \
idMinS, idMaxS ); \
if ( app.QueryError() != NERR_Success ) \
{ \
app.DisplayCtError( app.QueryError()); \
return (INT)app.QueryError(); \
} \
/* The following is a trick to get */ \
/* to the protected Run method of */ \
/* an APPLICATION subclass. */ \
APPLICATION * papp = &app; \
return papp->Run(); \
} \
extern "C" { \
INT WINAPI WinMain(HINSTANCE hInstance, \
HINSTANCE hPrevInstance, \
CHAR * pszCmdLine, \
INT nCmdShow) \
{ \
UNREFERENCED(hPrevInstance); \
UNREFERENCED(pszCmdLine); \
return BltMain(hInstance, nCmdShow ); \
} \
} \
#endif // _BLTAPP_HXX_ - end of file