|
|
/*----------------------------------------------------------------------------
ErrUtil.H Exported header file for Error module.
Copyright (C) Microsoft Corporation, 1993 - 1999 All rights reserved.
Authors: kennt Kenn Takara ----------------------------------------------------------------------------*/
#ifndef _ERRUTIL_H
#define _ERRUTIL_H
#if _MSC_VER >= 1000 // VC 5.0 or later
#pragma once
#endif
#ifndef _TFSINT_H
#include "tfsint.h"
#endif
BOOL FHrFailed(HRESULT hr); BOOL FHrSucceeded(HRESULT hr); BOOL FHrOK(HRESULT hr); #define FHrOk(hr) FHrOK(hr) // archaic case
inline BOOL FHrFailed(HRESULT hr) { return FAILED(hr); }
inline BOOL FHrSucceeded(HRESULT hr) { return SUCCEEDED(hr); }
inline BOOL FHrOK(HRESULT hr) { return hr == 0; }
/*---------------------------------------------------------------------------
Function: InitializeErrorObject
Initializes the error structure for the current thread (this is all done on a thread-by-thread basis). ---------------------------------------------------------------------------*/
extern "C" { TFSCORE_API(HRESULT) InitializeTFSError(); TFSCORE_API(HRESULT) CleanupTFSError();
TFSCORE_API(ITFSError *) GetTFSErrorObject(); TFSCORE_API(HANDLE) GetTFSErrorHeap();
TFSCORE_API(HRESULT) CreateTFSErrorInfo(LONG_PTR uReserved); TFSCORE_API(HRESULT) CreateTFSErrorInfoForThread(DWORD dwThreadId, LONG_PTR uReserved);
TFSCORE_API(HRESULT) DestroyTFSErrorInfo(LONG_PTR uReserved); TFSCORE_API(HRESULT) DestroyTFSErrorInfoForThread(DWORD dwThreadId, LONG_PTR uReserved);
TFSCORE_API(HRESULT) ClearTFSErrorInfo(LONG_PTR uReserved); TFSCORE_API(HRESULT) ClearTFSErrorInfoForThread(DWORD dwThreadId, LONG_PTR uReserved);
TFSCORE_API(HRESULT) GetTFSErrorInfo(TFSErrorInfo **ppErrInfo); TFSCORE_API(HRESULT) GetTFSErrorInfoForThread(DWORD dwThreadId, TFSErrorInfo **ppErrInfo);
TFSCORE_API(HRESULT) SetTFSErrorInfo(const TFSErrorInfo *pErrInfo); TFSCORE_API(HRESULT) SetTFSErrorInfoForThread(DWORD dwThreadId, const TFSErrorInfo *pErrInfo);
TFSCORE_API(HRESULT) TFSErrorInfoFree(TFSErrorInfo *pErrInfo);
TFSCORE_API(HRESULT) DisplayTFSErrorMessage(HWND hWnd);
#define FILLTFSERR_HIGH 0x01
#define FILLTFSERR_LOW 0x02
#define FILLTFSERR_GEEK 0x04
#define FILLTFSERR_NOCLOBBER 0x08
TFSCORE_API(HRESULT) FillTFSError(LONG_PTR uReserved, HRESULT hrLow, DWORD dwFlags, LPCTSTR pszHigh, LPCTSTR pszLow, LPCTSTR pszGeek);
TFSCORE_API(HRESULT) FillTFSErrorId(LONG_PTR uReserved, HRESULT hrLow, DWORD dwFlags, UINT nHigh, UINT nLow, UINT nGeek);
};
// Use this function for most error handling
TFSCORE_API(HRESULT) FormatError(HRESULT hr, TCHAR *pszBuffer, UINT cchBuffer);
/*---------------------------------------------------------------------------
Helper APIs for the COR macros. ---------------------------------------------------------------------------*/ TFSCORE_API(void) AddSystemErrorMessage(HRESULT hr); TFSCORE_API(void) AddWin32ErrorMessage(DWORD dwErr);
#define AddStringIdErrorMessage(hr,ids) FillTFSErrorId(0, hr, FILLTFSERR_HIGH, ids, 0, 0)
#define AddStringIdErrorMessage2(hr, ids, idsgeek) FillTFSErrorId(0, hr, FILLTFSERR_HIGH | FILLTFSERR_GEEK, ids, 0, idsgeek)
#define AddStringErrorMessage(hr, psz) FillTFSError(0, hr, FILLTFSERR_HIGH, psz, 0, 0)
#define AddStringErrorMessage2(hr, psz, pszGeek) FillTFSError(0, hr, FILLTFSERR_HIGH | FILLTFSERR_GEEK, psz, 0, pszGeek)
/*---------------------------------------------------------------------------
These next three functions set the high-level error string, but do NOT set the underlying HRESULT. ---------------------------------------------------------------------------*/ #define AddHighLevelErrorString(psz) AddStringErrorMessage(0, psz)
#define AddHighLevelErrorStringId(ids) AddStringIdErrorMessage(0, ids)
#define AddHighLevelErrorStringId2(ids, idsGeek) AddStringIdErrorMessage2(0, ids, idsGeek)
#define SetDefaultHighLevelErrorStringId(ids) \
FillTFSErrorId(0, hr, FILLTFSERR_HIGH | FILLTFSERR_NOCLOBBER, ids, 0, 0)
#define AddLowLevelErrorString(psz) FillTFSError(0, 0, FILLTFSERR_LOW, NULL, psz, NULL)
#define AddLowLevelErrorStringId(ids) FillTFSErrorId(0, 0, FILLTFSERR_LOW, NULL, ids, NULL)
#define AddGeekLevelErrorString(psz) FillTFSError(0, 0, FILLTFSERR_GEEK, NULL, NULL, psz)
#define AddGeekLevelErrorStringId(ids) FillTFSErrorId(0, 0, FILLTFSERR_GEEK, NULL, NULL, ids)
#define CORg(hResult) \
do\ {\ hr = (hResult);\ if (FHrFailed(hr))\ {\ AddSystemErrorMessage(hr);\ goto Error;\ }\ }\ while (FALSE)
#define CWRg(hResult) \
do\ {\ hr = (DWORD) hResult;\ hr = HRESULT_FROM_WIN32(hr);\ if (FHrFailed(hr))\ {\ AddSystemErrorMessage(hr);\ goto Error;\ }\ }\ while (FALSE)
#define CORg_s(hResult, ids)\
do\ {\ hr = (hResult);\ if (FHrFailed(hr))\ {\ AddStringIdErrorMessage(hr);\ goto Error;\ }\ }\ while (FALSE)
#define CORg_sz(hResult, sz)\
do\ {\ hr = (hResult);\ if (FHrFailed(hr))\ {\ AddStringErrorMessage(hr);\ goto Error;\ }\ }\ while (FALSE)
// Provide for an inline expansion
inline HRESULT HResultFromWin32(DWORD dwError) { return HRESULT_FROM_WIN32(dwError); }
#endif
|