如何让程序异常退出后重启
標(biāo) 題:如何讓程序異常退出后重啟
發(fā)信人:蔡子楠
出處:http://www.freeeim.com/
時(shí) 間:2008-02-14 11:25:22
???? “程序 FreeEIM.exe 遇到問題異常退出,是否重啟?”,類似的情況我們似乎碰見過,很多程序都有這個(gè)功能;這是怎么實(shí)現(xiàn)的呢?經(jīng)過一番努力,在MSDN找到了SetUnhandledExceptionFilter函數(shù),利用它,可以實(shí)現(xiàn)這個(gè)功能。其實(shí)這個(gè)過程叫做SEH("Structured Exception Handling")結(jié)構(gòu)化異常處理。是操作系統(tǒng)提供給程序設(shè)計(jì)者的強(qiáng)有力的處理程序錯(cuò)誤或異常的武器。我在這里簡單的說一下如何使用,如有錯(cuò)誤,請(qǐng)高手不吝指正。
???? 有了它,太好了。要是你的程序無緣無故蕩掉了,你可以利用它,幫你的程序重啟。
一,處理函數(shù)
程序在出現(xiàn)異常時(shí),會(huì)調(diào)用這個(gè)函數(shù),我們就在這里處理程序蕩后的所有事,包括重啟。
原型:LONG WINAPI FreeEIM_UnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo);
我們這里先簡單試驗(yàn)一下。
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 使用。
編譯看看有什么結(jié)果。
二,如何重啟
重啟也不難,這里我們用到一個(gè)函數(shù)WinExec,函數(shù)比較常用,不熟悉的上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 使用。
編譯一下,一個(gè)簡單的異常重啟程序就實(shí)現(xiàn)了。
參考文檔
《SEH in ASM 研究》 原文地址:http://www.pediy.com/bbshtml/bbs4/kanxue310.htm
作者:Hume/冷雨飄心
總結(jié)
以上是生活随笔為你收集整理的如何让程序异常退出后重启的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给做IT的一点心理安慰
- 下一篇: 程序员每天少吃===活120岁