[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;
}