如何让程序异常退出后重启
2008-02-14 14:42
417 查看
标 题:如何让程序异常退出后重启
发信人:蔡子楠
出处:http://www.freeeim.com/
时 间:2008-02-14 11:25:22
“程序 FreeEIM.exe 遇到问题异常退出,是否重启?”,类似的情况我们似乎碰见过,很多程序都有这个功能;这是怎么实现的呢?经过一番努力,在MSDN找到了SetUnhandledExceptionFilter函数,利用它,可以实现这个功能。其实这个过程叫做SEH("Structured Exception Handling")结构化异常处理。是操作系统提供给程序设计者的强有力的处理程序错误或异常的武器。我在这里简单的说一下如何使用,如有错误,请高手不吝指正。
有了它,太好了。要是你的程序无缘无故荡掉了,你可以利用它,帮你的程序重启。
一,处理函数
程序在出现异常时,会调用这个函数,我们就在这里处理程序荡后的所有事,包括重启。
原型:LONG WINAPI FreeEIM_UnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo);
我们这里先简单试验一下。
LONG WINAPI FreeEIM_UnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo)
{
MessageBox(NULL,"FreeEIM","FreeEIM",MB_OK);
return EXCEPTION_EXECUTE_HANDLER;
}// 此代码可以 COPY - PASTE 使用。
然后在OnInitDialog()里加入:
SetUnhandledExceptionFilter(FreeEIM_UnhandledExceptionFilter);// 此代码可以 COPY - PASTE 使用。
int *i=0;// 此代码可以 COPY - PASTE 使用。
*i=0;// 此代码可以 COPY - PASTE 使用。
编译看看有什么结果。
二,如何重启
重启也不难,这里我们用到一个函数WinExec,函数比较常用,不熟悉的上GOOGLE找一下。
LONG WINAPI FreeEIM_UnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo)
{
char szFileName[_MAX_PATH];
::GetModuleFileName(NULL, szFileName, _MAX_PATH);
if ( MessageBox(NULL,"程序 FreeEIM.exe 遇到问题异常退出,是否重启?","FreeEIM",MB_YESNO)
== IDYES )
WinExec(szFileName, SW_SHOW);
return EXCEPTION_EXECUTE_HANDLER;
}// 此代码可以 COPY - PASTE 使用。
然后在OnInitDialog()里加入:
SetUnhandledExceptionFilter(FreeEIM_UnhandledExceptionFilter);// 此代码可以 COPY - PASTE 使用。
int *i=0;// 此代码可以 COPY - PASTE 使用。
*i=0;// 此代码可以 COPY - PASTE 使用。
编译一下,一个简单的异常重启程序就实现了。
参考文档
《SEH in ASM 研究》 原文地址:http://www.pediy.com/bbshtml/bbs4/kanxue310.htm
作者:Hume/冷雨飘心
发信人:蔡子楠
出处:http://www.freeeim.com/
时 间:2008-02-14 11:25:22
“程序 FreeEIM.exe 遇到问题异常退出,是否重启?”,类似的情况我们似乎碰见过,很多程序都有这个功能;这是怎么实现的呢?经过一番努力,在MSDN找到了SetUnhandledExceptionFilter函数,利用它,可以实现这个功能。其实这个过程叫做SEH("Structured Exception Handling")结构化异常处理。是操作系统提供给程序设计者的强有力的处理程序错误或异常的武器。我在这里简单的说一下如何使用,如有错误,请高手不吝指正。
有了它,太好了。要是你的程序无缘无故荡掉了,你可以利用它,帮你的程序重启。
一,处理函数
程序在出现异常时,会调用这个函数,我们就在这里处理程序荡后的所有事,包括重启。
原型:LONG WINAPI FreeEIM_UnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo);
我们这里先简单试验一下。
LONG WINAPI FreeEIM_UnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo)
{
MessageBox(NULL,"FreeEIM","FreeEIM",MB_OK);
return EXCEPTION_EXECUTE_HANDLER;
}// 此代码可以 COPY - PASTE 使用。
然后在OnInitDialog()里加入:
SetUnhandledExceptionFilter(FreeEIM_UnhandledExceptionFilter);// 此代码可以 COPY - PASTE 使用。
int *i=0;// 此代码可以 COPY - PASTE 使用。
*i=0;// 此代码可以 COPY - PASTE 使用。
编译看看有什么结果。
二,如何重启
重启也不难,这里我们用到一个函数WinExec,函数比较常用,不熟悉的上GOOGLE找一下。
LONG WINAPI FreeEIM_UnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo)
{
char szFileName[_MAX_PATH];
::GetModuleFileName(NULL, szFileName, _MAX_PATH);
if ( MessageBox(NULL,"程序 FreeEIM.exe 遇到问题异常退出,是否重启?","FreeEIM",MB_YESNO)
== IDYES )
WinExec(szFileName, SW_SHOW);
return EXCEPTION_EXECUTE_HANDLER;
}// 此代码可以 COPY - PASTE 使用。
然后在OnInitDialog()里加入:
SetUnhandledExceptionFilter(FreeEIM_UnhandledExceptionFilter);// 此代码可以 COPY - PASTE 使用。
int *i=0;// 此代码可以 COPY - PASTE 使用。
*i=0;// 此代码可以 COPY - PASTE 使用。
编译一下,一个简单的异常重启程序就实现了。
参考文档
《SEH in ASM 研究》 原文地址:http://www.pediy.com/bbshtml/bbs4/kanxue310.htm
作者:Hume/冷雨飘心
相关文章推荐
- 让程序异常退出后自动重启
- 如何设置当程序出现异常后进行重启
- 如何在程序异常或正常退出JVM时执行特定代码
- 程序崩溃自动重启和未捕获到的异常写退出栈
- C#WinForm程序异常退出的捕获、继续执行与自动重启
- 如何防止后台线程抛出的异常让程序崩溃退出
- 【知识必备】如何优雅的退出应用和处理崩溃异常并重启
- 转 C#WinForm程序异常退出的捕获、继续执行与自动重启
- 程序异常立刻退出,如何定位关键代码位置
- 如何在程序异常或正常退出JVM时执行特定代码
- C#WinForm程序异常退出的捕获、继续执行与自动重启
- C#WinForm程序异常退出的捕获、继续执行与自动重启
- 如何在程序异常退出前输出当前进程的堆栈信息 Backtraces
- Linux-- 简单的程序守护脚本,程序异常退出后自动重启
- 让程序异常退出后自动重启
- C#WinForm程序异常退出的捕获、继续执行与自动重启
- MFC 程序崩溃自动重启 和 未捕获到的异常写退出栈
- 【知识必备】如何优雅的退出应用和处理崩溃异常并重启
- MDI 程序一退出就出现程序异常
- 如何解决放到android /system/app 下的应用程序无限重启弹出“异常终止”的问题