Спасите от непонятного exception'a !
От: crazy25  
Дата: 20.10.03 11:36
Оценка: 8 (1)
Есть измененный код, примера из MSDN, использования функции _set_se_translator, которая позволяет транслировать SE-исключение в C++ исключение. Функция отрабатывает, но printf внутри trans_func получает не верные данные.
Т.к. в этом коде, в функции SEFunc происходит EXCEPTION_ACCESS_VIOLATION в связи с чтением по адресу 0, согласно MSDN в ExceptionInformation[0] должна быть 0, а в ExceptionInformation[1] должен быть адрес 0x0.
На самом деле, получаемые в trans_func данные такие: ExceptionInformation[0]=0, ExceptionInformation[1]=0xFFFFFFFF.

Почему такое происходит и как можно получить реальный адрес чтения/записи приведшего к ошибке ?
Вот код эксперимента:
/*  SETRANS.CPP 
 */

#include <stdio.h>
#include <windows.h>
#include <eh.h>

void SEFunc();
void trans_func( unsigned int, EXCEPTION_POINTERS* );

class SE_Exception
{
private:
    unsigned int nSE;
public:
    SE_Exception() {}
    SE_Exception( unsigned int n ) : nSE( n ) {}
    ~SE_Exception() {}
    unsigned int getSeNumber() { return nSE; }
};
void main( void )
{
    try
    {
        _set_se_translator( trans_func );
        SEFunc();
    }
    catch( SE_Exception e )
    {
        printf( "Caught a __try exception with SE_Exception.\n" );
    }
}
void SEFunc()
{
    __try
    {
      printf("%c", *(char *) 0x0);
    }
    __finally
    {
        printf( "In finally\n" );
    }
}
void trans_func( unsigned int u, EXCEPTION_POINTERS* pExp )
{
  printf("%X, %X\n",
    pExp->ExceptionRecord->ExceptionInformation[0],
    pExp->ExceptionRecord->ExceptionInformation[1]);
  throw SE_Exception();
}



20.10.03 18:45: Перенесено модератором из 'C/C++' — ПК
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.