Есть вот такой код:
EXCEPTION_DISPOSITION __cdecl _except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame,
struct _CONTEXT *ContextRecord, void * DispatcherContext )
{
// Видимо, здесь нужно вычислить адрес __label1 и сделать ContextRecord->Eip = (DWORD) __label1 и вернуть ExceptionContinueExecution;
// Или нет..
}
int main(int argc, CHAR* argv[])
{
DWORD handler = (DWORD) _except_handler;
__asm
{
push handler
push FS:[0]
mov FS:[0],ESP
}
__asm {
xor eax, eax
call eax
}
printf("...");
__asm
{
mov eax,[ESP]
mov FS:[0], EAX
add esp, 8
}
__label1:
printf("OK");
Как правильно изменить данный код, чтобы исключение было обработано и команда printf("OK") выполнилась?
Вместо printf("...") может быть любой другой код, поэтому в обработчике исключения, как я понимаю, нужно еще стек удержать, чтобы спокойно продолжить работу..
Здравствуйте, Аноним, Вы писали:
А>Есть вот такой код:
А>А>EXCEPTION_DISPOSITION __cdecl _except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame,
...
А>
А>Как правильно изменить данный код, чтобы исключение было обработано и команда printf("OK") выполнилась?
Вот так:
int main(int argc, CHAR* argv[])
{
try
{
throw "ERROR";
}
catch (...)
{
printf("OK");
}
}
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.