Отладка приложений


Использование CrashHandler API - часть 3


// Выключить предупреждение: 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);




Начало  Назад  Вперед



Книжный магазин