(PS:SetUnhandledExceptionFilter()並不能處理所有的異常,比如CRT異常需要調用_set_invalid_parameter_handler()纔行。)
//設置異常處理回調函數
SetUnhandledExceptionFilter(UnhandledExceptionFilter);
//異常處理代碼
//EXCEPTION_EXECUTE_HANDLER equ 1 表示我已經處理了異常,可以優雅地結束了
//EXCEPTION_CONTINUE_SEARCH equ 0 表示我不處理,其他人來吧,於是windows調用默認的處理程序顯示一個錯誤框,並結束
//EXCEPTION_CONTINUE_EXECUTION equ -1 表示錯誤已經被修復,請從異常發生處繼續執行
LONG
UnhandledExceptionFilter(
struct
_EXCEPTION_POINTERS
* ExceptionInfo)
{
CString strDumpFile;
strDumpFile.Format(
"%d"
,CTime::GetCurrentTime().GetTickCount());
strDumpFile +=
".dmp "
;
HANDLE
hFile = CreateFile(strDumpFile, GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL );
if
(hFile!=INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION ExInfo;
ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = ExceptionInfo;
ExInfo.ClientPointers = NULL;
// write the dump
BOOL
bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL );
CloseHandle(hFile);
}
theApp.PostThreadMessage(WM_QUIT,0,0);
return
EXCEPTION_EXECUTE_HANDLER;
}