385 lines
8.9 KiB
C++
385 lines
8.9 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1996-1998 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// ExcOper.h
|
|
//
|
|
// Implementation File:
|
|
// ExcOper.cpp
|
|
//
|
|
// Description:
|
|
// Definition of the exception classes.
|
|
//
|
|
// Author:
|
|
// David Potter (davidp) May 20, 1996
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Notes:
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _EXCOPER_H_
|
|
#define _EXCOPER_H_
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Include Files
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Forward Class Declarations
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CExceptionWithOper;
|
|
class CNTException;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Type Definitions
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
typedef DWORD SC;
|
|
|
|
#define EXCEPT_MAX_OPER_ARG_LENGTH 260
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Wire in MFC if this is an MFC image.
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef __AFX_H__
|
|
|
|
#define IDP_NO_ERROR_AVAILABLE AFX_IDP_NO_ERROR_AVAILABLE
|
|
|
|
inline int EXC_AppMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 )
|
|
{
|
|
return AfxMessageBox( lpszText, nType, nIDHelp );
|
|
}
|
|
|
|
inline int EXC_AppMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT)-1 )
|
|
{
|
|
return AfxMessageBox( nIDPrompt, nType, nIDHelp );
|
|
}
|
|
|
|
inline int EXC_AppMessageBox( HWND hwndParent, LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 )
|
|
{
|
|
return AfxMessageBox( lpszText, nType, nIDHelp );
|
|
}
|
|
|
|
inline int EXC_AppMessageBox( HWND hwndParent, UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT)-1 )
|
|
{
|
|
return AfxMessageBox( nIDPrompt, nType, nIDHelp );
|
|
}
|
|
|
|
inline HINSTANCE EXC_GetResourceInstance( void )
|
|
{
|
|
return AfxGetApp()->m_hInstance;
|
|
}
|
|
|
|
#endif // __AFX_H__
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// class CException
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef __AFX_H__
|
|
|
|
class CException
|
|
{
|
|
public:
|
|
BOOL m_bAutoDelete;
|
|
#if DBG || defined( _DEBUG )
|
|
protected:
|
|
BOOL m_bReadyForDelete;
|
|
public:
|
|
#endif // DBG || defined( _DEBUG )
|
|
|
|
CException( void )
|
|
{
|
|
m_bAutoDelete = TRUE;
|
|
#if DBG || defined( _DEBUG )
|
|
m_bReadyForDelete = FALSE;
|
|
#endif // DBG || defined( _DEBUG )
|
|
}
|
|
|
|
CException( BOOL bAutoDelete )
|
|
{
|
|
m_bAutoDelete = bAutoDelete;
|
|
#if DBG || defined( _DEBUG )
|
|
m_bReadyForDelete = FALSE;
|
|
#endif // DBG || defined( _DEBUG )
|
|
}
|
|
|
|
virtual ~CException( void )
|
|
{
|
|
}
|
|
|
|
void Delete( void ) // use to delete exception in 'catch' block
|
|
{
|
|
// delete exception if it is auto-deleting
|
|
if ( m_bAutoDelete > 0 )
|
|
{
|
|
#if DBG || defined( _DEBUG )
|
|
m_bReadyForDelete = TRUE;
|
|
#endif // DBG || defined( _DEBUG )
|
|
delete this;
|
|
}
|
|
}
|
|
|
|
virtual BOOL GetErrorMessage(
|
|
LPTSTR lpszError,
|
|
UINT nMaxError,
|
|
PUINT pnHelpContext = NULL
|
|
)
|
|
{
|
|
if ( pnHelpContext != NULL )
|
|
*pnHelpContext = 0;
|
|
|
|
if ( nMaxError != 0 && lpszError != NULL )
|
|
*lpszError = '\0';
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
virtual int ReportError( UINT nType = MB_OK, UINT nError = 0 );
|
|
|
|
#if DBG || defined( _DEBUG )
|
|
void PASCAL operator delete( void * pbData )
|
|
{
|
|
// check for proper exception object deletion
|
|
CException * pException = (CException *) pbData;
|
|
|
|
// use: pException->Delete(), do not use: delete pException
|
|
ASSERT( pException->m_bReadyForDelete );
|
|
ASSERT( pException->m_bAutoDelete > 0 );
|
|
|
|
// avoid crash when assert above is ignored
|
|
if ( pException->m_bReadyForDelete && pException->m_bAutoDelete > 0 )
|
|
::operator delete( pbData );
|
|
}
|
|
#endif // DBG || defined( _DEBUG )
|
|
|
|
}; // class CException
|
|
|
|
#endif // __AFX_H__
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// class CExceptionWithOper
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
typedef int (WINAPI *PFNMSGBOX)( DWORD dwParam, LPCTSTR lpszText, UINT nType, UINT nIDHelp );
|
|
|
|
class CExceptionWithOper : public CException
|
|
{
|
|
#ifdef __AFX_H__
|
|
// abstract class for dynamic type checking
|
|
DECLARE_DYNAMIC( CExceptionWithOper )
|
|
#endif // __AFX_H__
|
|
|
|
public:
|
|
// Constructors
|
|
CExceptionWithOper(
|
|
IN UINT idsOperation,
|
|
IN LPCTSTR pszOperArg1 = NULL,
|
|
IN LPCTSTR pszOperArg2 = NULL
|
|
)
|
|
{
|
|
SetOperation(idsOperation, pszOperArg1, pszOperArg2);
|
|
|
|
} // CExceptionWithOper()
|
|
|
|
CExceptionWithOper(
|
|
IN UINT idsOperation,
|
|
IN LPCTSTR pszOperArg1,
|
|
IN LPCTSTR pszOperArg2,
|
|
IN BOOL bAutoDelete
|
|
)
|
|
: CException( bAutoDelete )
|
|
{
|
|
SetOperation( idsOperation, pszOperArg1, pszOperArg2 );
|
|
|
|
} // CExceptionWithOper(bAutoDelete)
|
|
|
|
// Operations
|
|
public:
|
|
virtual BOOL GetErrorMessage(
|
|
LPTSTR lpszError,
|
|
UINT nMaxError,
|
|
PUINT pnHelpContext = NULL
|
|
)
|
|
{
|
|
// Format the operation string.
|
|
FormatWithOperation( lpszError, nMaxError, NULL );
|
|
|
|
return TRUE;
|
|
|
|
} // GetErrorMessage()
|
|
virtual int ReportError(
|
|
UINT nType = MB_OK,
|
|
UINT nError = 0
|
|
);
|
|
|
|
virtual int ReportError(
|
|
HWND hwndParent,
|
|
UINT nType = MB_OK,
|
|
UINT nError = 0
|
|
);
|
|
|
|
virtual int ReportError(
|
|
PFNMSGBOX pfnMsgBox,
|
|
DWORD dwParam,
|
|
UINT nType = MB_OK,
|
|
UINT nError = 0
|
|
);
|
|
|
|
void SetOperation(
|
|
IN UINT idsOperation,
|
|
IN LPCTSTR pszOperArg1 = NULL,
|
|
IN LPCTSTR pszOperArg2 = NULL
|
|
);
|
|
|
|
void SetOperationIfEmpty(
|
|
IN UINT idsOperation,
|
|
IN LPCTSTR pszOperArg1 = NULL,
|
|
IN LPCTSTR pszOperArg2 = NULL
|
|
)
|
|
{
|
|
if ( m_idsOperation == 0 )
|
|
{
|
|
SetOperation( idsOperation, pszOperArg1, pszOperArg2 );
|
|
} // if: exception is empty
|
|
|
|
} //*** SetOperationIfEmpty()
|
|
|
|
void FormatWithOperation(
|
|
OUT LPTSTR lpszError,
|
|
IN UINT nMaxError,
|
|
IN LPCTSTR pszMsg
|
|
);
|
|
|
|
// Implementation
|
|
protected:
|
|
UINT m_idsOperation;
|
|
TCHAR m_szOperArg1[EXCEPT_MAX_OPER_ARG_LENGTH];
|
|
TCHAR m_szOperArg2[EXCEPT_MAX_OPER_ARG_LENGTH];
|
|
|
|
public:
|
|
UINT IdsOperation( void ) const { return m_idsOperation; }
|
|
LPTSTR PszOperArg1( void ) { return m_szOperArg1; }
|
|
LPTSTR PszOperArg2( void ) { return m_szOperArg2; }
|
|
|
|
}; //*** class CExceptionWithOper
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// class CNTException
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CNTException : public CExceptionWithOper
|
|
{
|
|
#ifdef __AFX_H__
|
|
// abstract class for dynamic type checking
|
|
DECLARE_DYNAMIC( CNTException )
|
|
#endif // __AFX_H__
|
|
|
|
public:
|
|
// Constructors
|
|
CNTException(
|
|
IN SC sc,
|
|
IN UINT idsOperation = NULL,
|
|
IN LPCTSTR pszOperArg1 = NULL,
|
|
IN LPCTSTR pszOperArg2 = NULL
|
|
)
|
|
: CExceptionWithOper( idsOperation, pszOperArg1, pszOperArg2 )
|
|
, m_sc( sc )
|
|
{
|
|
} // CNTException()
|
|
|
|
CNTException(
|
|
IN SC sc,
|
|
IN UINT idsOperation,
|
|
IN LPCTSTR pszOperArg1,
|
|
IN LPCTSTR pszOperArg2,
|
|
IN BOOL bAutoDelete
|
|
)
|
|
: CExceptionWithOper( idsOperation, pszOperArg1, pszOperArg2, bAutoDelete )
|
|
, m_sc( sc )
|
|
{
|
|
} // CNTException( bAutoDelete )
|
|
|
|
// Operations
|
|
public:
|
|
virtual BOOL GetErrorMessage(
|
|
LPTSTR lpszError,
|
|
UINT nMaxError,
|
|
PUINT pnHelpContext = NULL
|
|
)
|
|
{
|
|
return FormatErrorMessage( lpszError, nMaxError, pnHelpContext, TRUE /*bIncludeID*/ );
|
|
|
|
} //*** GetErrorMessage()
|
|
|
|
BOOL FormatErrorMessage(
|
|
LPTSTR lpszError,
|
|
UINT nMaxError,
|
|
PUINT pnHelpContext = NULL,
|
|
BOOL bIncludeID = FALSE
|
|
);
|
|
|
|
void SetOperation(
|
|
IN SC sc,
|
|
IN UINT idsOperation,
|
|
IN LPCTSTR pszOperArg1 = NULL,
|
|
IN LPCTSTR pszOperArg2 = NULL
|
|
)
|
|
{
|
|
m_sc = sc;
|
|
CExceptionWithOper::SetOperation( idsOperation, pszOperArg1, pszOperArg2 );
|
|
} //*** SetOperation()
|
|
|
|
void SetOperationIfEmpty(
|
|
IN SC sc,
|
|
IN UINT idsOperation,
|
|
IN LPCTSTR pszOperArg1 = NULL,
|
|
IN LPCTSTR pszOperArg2 = NULL
|
|
)
|
|
{
|
|
if ( (m_sc == ERROR_SUCCESS) && (m_idsOperation == 0) )
|
|
{
|
|
m_sc = sc;
|
|
CExceptionWithOper::SetOperation( idsOperation, pszOperArg1, pszOperArg2 );
|
|
} // if: exception is empty
|
|
} //*** SetOperationIfEmpty()
|
|
|
|
// Implementation
|
|
protected:
|
|
SC m_sc;
|
|
|
|
public:
|
|
SC Sc( void ) { return m_sc; }
|
|
|
|
}; //*** class CNTException
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Global Functions
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void ThrowStaticException(
|
|
IN UINT idsOperation = NULL,
|
|
IN LPCTSTR pszOperArg1 = NULL,
|
|
IN LPCTSTR pszOperArg2 = NULL
|
|
);
|
|
void ThrowStaticException(
|
|
IN SC sc,
|
|
IN UINT idsOperation = NULL,
|
|
IN LPCTSTR pszOperArg1 = NULL,
|
|
IN LPCTSTR pszOperArg2 = NULL
|
|
);
|
|
BOOL FormatErrorMessage(
|
|
DWORD sc,
|
|
LPTSTR lpszError,
|
|
UINT nMaxError
|
|
);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#endif // _EXCOPER_H_
|