Модуль обработки исключения: Код (Text): unit seh; interface uses Windows; const ExceptionContinueExecution = 0; ExceptionContinueSearch = 1; ExceptionNestedException = 2; ExceptionCollidedUnwind = 3; procedure Start; procedure Stop; function _except_handler(ExceptionRecord: PExceptionRecord; EstablisherFrame: pointer; ContextRecord: PContext; DispatcherContext: pointer): Integer; cdecl; implementation function _except_handler(ExceptionRecord: PExceptionRecord; EstablisherFrame: pointer; ContextRecord: PContext; DispatcherContext: pointer): Integer; cdecl; begin MessageBox(0, 'Error', 'Error', MB_OK or MB_ICONWARNING); Result := ExceptionContinueSearch; end; procedure Start; asm push offset _except_handler push dword ptr fs:[0] mov fs:[0], esp end; procedure Stop; asm pop dword ptr fs:0 add esp, 4 end; end. Вызов ошибки: Код (Text): Start; asm mov EAX, 0 mov [EAX], 1 end; MessageBox(0, '1', '1', MB_OK); Stop; Под средой уже боюсь запускать, чтоб синего не было... Главное без среды Delphi прога просто вылетает...
Батенька, ну как можно так наивно устанавливать SEH в процедуре ?! У тебя же в Start в конце стоит "невидимый" ret который все портит. Если уж хочешь в процедуре, то нужно делать вот так: Код (Text): procedure Start; asm pop eax ;сохраняем адрес возврата из процедуры push offset _except_handler push dword ptr fs:[0] mov fs:[0], esp push eax ;восстанавливаем адрес возврата end; Тоже самое ес-но нужно сделать и в Stop