SEH转化为C++异常

//==============================================================================
//
// 项目名 :数据库
// 文件名 :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__
//==============================================================================


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值