Есть измененный код, примера из 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++' — ПК