//==============================================================================
//
// 项目名 :数据库
// 文件名 :XDBWin32Exception.h
// 作 者 :
// 用 途 :Win32结构化异常封装类。
//
//==============================================================================
// 版本记录
//==============================================================================
//
// V0.1 2005-5-18 13:25:12
//
//
//==============================================================================
#ifndef __XDBWIN32EXCEPTION__H__INCLUDED__
#define __XDBWIN32EXCEPTION__H__INCLUDED__
//==============================================================================
//
// 把Win32结构化异常转化为标准的C++异常来处理,这样可以避免SEH异常
// 无法处理对象的析构函数的问题
//
/// <summary>
/// WIN32结构化异常封装类。
/// </summary>
class XDBWin32Exception
{
public:
/// <summary>
/// 将结构化异常映射为C++异常。
/// </summary>
/// <remarks>
/// 需要为每个线程(线程进入点函数)调用该函数。
/// </remarks>
static void MapWin32ExceptionToCPP()
{
_set_se_translator( XDBWin32Exception::TranslateWin32ExceptionToCPP );
}
/// <summary>
/// 获得结构化异常信息。
/// </summary>
PEXCEPTION_POINTERS ExceptionPointers()
{
return m_pException;
}
/// <summary>
/// 获得结构化异常代码。
/// </summary>
DWORD ExceptionCode()
{
if( NULL != m_pException &&
NULL != m_pException->ExceptionRecord )
return m_pException->ExceptionRecord->ExceptionCode;
else
return 0;
}
/// <summary>
/// 获得结构化异常地址。
/// </summary>
PVOID ExceptionAddress()
{
if( NULL != m_pException &&
NULL != m_pException->ExceptionRecord )
return m_pException->ExceptionRecord->ExceptionAddress;
else
return NULL;
}
private:
/// <summary>
/// 构造函数。
/// </summary>
XDBWin32Exception( PEXCEPTION_POINTERS pException )
{
m_pException = pException;
}
/// <summary>
/// 将Win32结构化异常翻译为C++异常的转换函数。
/// </summary>
/// <param name="nExceptioCode">
/// 结构化异常代码。
/// </param>
/// <param name="pException">
/// 结构化异常信息。
/// </param>
static void TranslateWin32ExceptionToCPP( UINT nExceptioCode , PEXCEPTION_POINTERS pException )
{
throw XDBWin32Exception( pException );
}
/// 结构化异常信息
PEXCEPTION_POINTERS m_pException;
};
//==============================================================================
// 辅助宏
//==============================================================================
// 设置结构化异常映射为C++异常的转换函数
#define MAP_SEH_TO_CPP_EXCEPTION() XDBWin32Exception::MapWin32ExceptionToCPP();
//==============================================================================
#endif // __XDBWIN32EXCEPTION__H__INCLUDED__
//==============================================================================