Выключить предупреждение: initializers put in
// Выключить предупреждение: initializers put in library initialization
// area (инициализаторы помещены в область инициализации)
#pragma warning (disable : 4073)
#pragma init_seg(lib)
class CleanUpCrashHandler
{
public :
CleanUpCrashHandler ( void)
{
}
--CleanUpCrashHandler ( void)
{
// Есть ли запрос на распределение памяти?
if ( NULL != g_ahMod)
{
VERIFY ( HeapFree ( GetProcessHeap (),
0
g_ahMod ));
g_ahMod = NULL;
}
if ( NULL != g_pfnOrigFilt)
{
У/ Восстановить оригинальный фильтр необрабатываемых
// исключений.
SetUnhandledExceptionFilter ( g_pfnOrigFilt);
}
}
};
// Статический класс
static CleanUpCrashHandler g_cBeforeAndAfter;
/*/////////////////////////////////////////////////
Инициализация функции обработчика аварий
////////////////////////////////////////////////*/
BOOL _stdcall SetCrashHandlerFilter ( PFNCHFILTFN pFn)
{
// NULL-параметр "отцепляет" обратный вызов.
if { NULL == pFn)
{
if ( NULL != g_pfnOrigFilt)
{
// Восстановить оригинальный фильтр необрабатываемых
// исключений.
SetUnhandledExceptionFilter ( g_pfnOrigFilt);
g_pfnOrigFilt = NULL;
if ( NULL ! = g_ahMod)
{
free ( g_ahMod);
g_ahMod = NULL;
}
g_pfnCallBack = NULL;
}
}
else
{
ASSERT ( FALSE == IsBadCodePtr ( (FARPROC)pFn));
if ( TRUE •== IsBadCodePtr { (FARPROC)pFn))
{
return ( FALSE);
}
g_pfnCallBack = pFn;
// Если обработчик аварии заказчика уже используется,
// активизировать CrashHandlerExceptionFilter и сохранить
// оригинальный фильтр необрабатываемых исключений.
if ( NULL = = g_pfnOrigFilt)
{
g_pfnOrigFilt =
SetUnhandledExceptionFilter( CrashHandlerExceptionFilter);
}
}
return ( TRUE);
}
BOOL _stdcall AddCrashHandlerLimitModule ( HMODULE hMod)
{
// Проверить очевидные случаи
ASSERT ( NULL != hMod);
Содержание Назад Вперед