LASTERR.H

///////////////////////////////////////////////////////////////// 
// LASTERR.H
//
// Copyright 1986-1996 Microsoft Corporation. All Rights Reserved.
//
//
// last err support object.
//

//There should be no global objects of this class
// because by the time the dectructor of a global CLastError
// is called, MAPIFreeBuffer does not work.

#ifndef __LASTERR_H__
#define __LASTERR_H__

class CLastError
{
public:
CLastError(LPSTR);
~CLastError(void);

// standard OLE or MAPI errors.
HRESULT HrSetLastError(HRESULT hr);

// our internal extended error codes or a non-standard string for OLE or MAPI errors
// scFORM is one of the errors defined by MAKE_FORM_X_SCODE macro family
HRESULT HrSetLastError(HRESULT hr, SCODE scFORM, ...);

// errors returned from underlying objects.
HRESULT HrSetLastError(HRESULT hr, IUnknown* punk);

// our implementation of GetLastError
HRESULT HrGetLastError(HRESULT hr, DWORD dwFlags,
LPMAPIERROR * lppMAPIError);

//displays the last error info
int ShowError(HWND);


private:
// we have three possible error types: our internal errors which
// we signify by MAPI_E_EXTENDED to the user, standard errors
// defined by MAPI and errors returned by objects we keep and utilize.

enum {eNoError, eExtended, eMAPI, eObject} m_eLastErr;

HRESULT m_hrLast;

HRESULT m_hrGLE; // what GetLastError on the object returned; mostly 0
LPMAPIERROR m_pmapierr;
LPSTR m_szComponent;
};


inline CLastError::CLastError(LPSTR szComponent)
{
m_eLastErr = eNoError;
m_hrLast = 0;
m_hrGLE = 0;
m_pmapierr = 0;

m_szComponent = NULL;

if(!MAPIAllocateBuffer(lstrlen(szComponent) +1,
(LPVOID *) &m_szComponent))
{
lstrcpy(m_szComponent, szComponent);
}

}

inline CLastError::~CLastError()
{
if (m_pmapierr != NULL)
{
MAPIFreeBuffer(m_pmapierr);
}
if(m_szComponent != NULL)
{
MAPIFreeBuffer(m_szComponent);
}
}

#endif // __LASTERR_H__