C++ C# 程序异常重启
“程序 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 使用。
编译一下,一个简单的异常重启程序就实现了。
既然C++已经可以实现异常重启,那么用C#就可以仿照上面的方法调用AIP来进行一场重启。
一下是实现代码,大家可以试一下:
{
public delegate Int32 CallBack(ref long a);
private static CallBack mycall = new CallBack(NewExceptionFilter);
public static Int32 NewExceptionFilter(ref long a)
{
System.Threading.Thread.Sleep(1000);
Process proExplorer = new Process();
proExplorer.StartInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
proExplorer.Start();
//return 0; //如果return 0 的话,接着还会弹出windows 底层的异常框
return 1; //return 1 可以屏蔽掉windows 底层的异常框
}
[DllImport("kernel32")]
private static extern Int32 SetUnhandledExceptionFilter(CallBack cb);
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
SetUnhandledExceptionFilter(mycall);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}
}
浙公网安备 33010602011771号