[c/c++/seh]TDM-GCC-64 下的 seh 示例
都说 TDM-GCC-64 支持 seh ,那么具体的代码应该怎样写呢? 搜索整个中文代码世界,我就没见过.
以下是一个可用的示例,但应该不是标准做法.
#include <stdio.h>
#include <windows.h>
#include <Dbghelp.h>
////
#include <excpt.h> //vc 的__try 要用的
LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException)
{
	printf("UnhandledExceptionFilterEx call\n");
	//return EXCEPTION_CONTINUE_SEARCH;
	return EXCEPTION_EXECUTE_HANDLER; //继续运行后面的,前面的那个不行
}
int exceptEx(_In_ EXCEPTION_POINTERS *lpEP)
{
	return UnhandledExceptionFilterEx(lpEP);
}
int main()
{
	printf("aaa\r\n");
	//mingw-w64 下的 seh 测试
	//------------------------------------------
	//可以,但是代码有点多
	//https://blog.csdn.net/aa13058219642/article/details/80263706
	 //方式2 __try1/__except1拦截异常 
	__try1(exceptEx) {
		//crashFunc(); 
		BYTE* pch;
		pch = (BYTE*)00001234;   //给予一个非法地址
		*pch = 6; //对非法地址赋值,会造成Access Violation 异常
	} __except1
	{
		printf("crash __except1\n");
	}
		//------------------------------------------
		//https://www.cnblogs.com/nchxmoon/p/5106215.html
		//好象 vc 才行
		/*
			__try
			{
					BYTE* pch ;
		pch = ( BYTE* )00001234 ;   //给予一个非法地址
		*pch = 6 ; //对非法地址赋值,会造成Access Violation 异常
			}
			__except(EXCEPTION_EXECUTE_HANDLER)
			{
				MessageBox(0, L"SEH", 0, 0);
			}
		*/
		//------------------------------------------
		//https://blog.csdn.net/jffyuhgv/article/details/87628879#_Toc31321
		//好象不行
		/*
		__seh_try {
		int n=5/0;
				  puts(" ---after");
			}
			__seh_except(info, context)
			{
				puts("  catch .....ok  ");
			}
			__seh_end
		*/
		//------------------------------------------
		/*
		__try
		{
		BYTE* pch ;
		pch = ( BYTE* )00001234 ;   //给予一个非法地址
		*pch = 6 ; //对非法地址赋值,会造成Access Violation 异常
		}
		__catch(...)
		{
		AfxMessageBox( "catched" ) ;
		} s
		*/
	printf("ccc\r\n");
	return 0;
}