64,654
社区成员
发帖
与我相关
我的任务
分享
#define RLIB_EnableException
//#undef RLIB_EnableException
//是否启用自定义异常处理模型
#ifdef RLIB_EnableException
#pragma runtime_checks("s", off) //禁止检查Esp
#define RLIB_Try(handler0,label0) void *handler0;__asm mov handler0, offset label0;
#define RLIB_Catch(label1) label1:
#define RLIB_Next(label2) goto label2;
#define RLIB_Finally(label3) label3:
#define RLIB_Throw(handler1) RLIB_Throw_Inline(handler1);return;
inline void RLIB_Throw_Inline(void *phandler)
{
__asm
{
mov eax, phandler
mov [ebp + 4], eax
//leave
//ret
}
}
#endif // RLIB_EnableException
void *ExceptionHandler;
void ThrowException(void *)
{
RLIB_Throw(ExceptionHandler);
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
RLIB_Try(Handler, OnException)
ExceptionHandler = Handler;//保存OnException地址到全局
{
ThrowException(NULL);
RLIB_Next(EndException)
}
RLIB_Catch(OnException)
{
//__asm { add esp, 4h } //How to do?
ShowMsg(T("异常被捕捉"));
goto exit__;
}
RLIB_Finally(EndException)
{
ShowMsg(T("异常未被捕捉或未触发异常"));
}
exit__:
return 0;//这里不正常, 无法正常返回
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
int _stack_diff;
__asm mov _stack_diff, ebp;
__asm sub _stack_diff, esp;
RLIB_Try(Handler, OnException)
ExceptionHandler = Handler;//±£´æOnExceptionµØÖ·µ½È«¾Ö
{
ThrowException(NULL);
RLIB_Next(EndException)
}
RLIB_Catch(OnException)
{
//__asm { add esp, 4h } //How to do?
ShowMsg(_T("Òì³£±»²¶×½"));
__asm sub esp, 4h; // for int _stack_diff;
goto exit__;
}
RLIB_Finally(EndException)
{
ShowMsg(_T("Ò쳣δ±»²¶×½»òδ´¥·¢Òì³£"));
__asm mov esp, ebp;
__asm sub esp, _stack_diff;
}
exit__:
return 0;//ÕâÀï²»Õý³£, ÎÞ·¨Õý³£·µ»Ø
}