SEH转化为C++异常

来源:互联网 发布:冒险岛2 账号数据异常 编辑:程序博客网 时间:2024/05/21 11:21
//==============================================================================//// 项目名 :数据库// 文件名 :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;elsereturn 0;}/// <summary> /// 获得结构化异常地址。/// </summary> PVOID ExceptionAddress(){if( NULL != m_pException &&NULL != m_pException->ExceptionRecord )return m_pException->ExceptionRecord->ExceptionAddress;elsereturn 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__//==============================================================================