如何让程序异常退出后重启
標 題:如何讓程序異常退出后重啟
發信人:蔡子楠
出處: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/冷雨飄心
總結
以上是生活随笔為你收集整理的如何让程序异常退出后重启的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给做IT的一点心理安慰
- 下一篇: 系统间通信1:阻塞与非阻塞式通信A