199 lines
7.4 KiB
C++
199 lines
7.4 KiB
C++
|
/**********************************************************************/
|
||
|
/** 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
|