SEH в C++ и Delphi

Тема в разделе "WASM.WIN32", создана пользователем SnugForce, 13 окт 2005.

  1. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Модуль обработки исключения:
    Код (Text):
    1.  
    2. unit seh;
    3. interface
    4. uses Windows;
    5. const
    6.   ExceptionContinueExecution = 0;
    7.   ExceptionContinueSearch = 1;
    8.   ExceptionNestedException = 2;
    9.   ExceptionCollidedUnwind = 3;
    10. procedure Start;
    11. procedure Stop;
    12. function _except_handler(ExceptionRecord: PExceptionRecord;
    13.                           EstablisherFrame: pointer;
    14.                           ContextRecord: PContext;
    15.                           DispatcherContext: pointer): Integer; cdecl;
    16.  
    17. implementation  
    18.  
    19. function _except_handler(ExceptionRecord: PExceptionRecord;
    20.                           EstablisherFrame: pointer;
    21.                           ContextRecord: PContext;
    22.                           DispatcherContext: pointer): Integer; cdecl;
    23. begin
    24.  
    25.   MessageBox(0, 'Error', 'Error', MB_OK or MB_ICONWARNING);
    26.   Result := ExceptionContinueSearch;
    27. end;
    28. procedure Start;
    29.   asm
    30.     push offset _except_handler
    31.     push dword ptr fs:[0]
    32.     mov fs:[0], esp
    33.   end;
    34. procedure Stop;
    35.   asm
    36.     pop dword ptr fs:0
    37.     add esp, 4
    38.   end;
    39. end.
    40.  


    Вызов ошибки:
    Код (Text):
    1.  
    2. Start;
    3.   asm
    4.     mov EAX, 0
    5.     mov [EAX], 1
    6.   end;
    7.   MessageBox(0, '1', '1', MB_OK);
    8.   Stop;
    9.  


    Под средой уже боюсь запускать, чтоб синего не было...

    Главное без среды Delphi прога просто вылетает...
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Батенька, ну как можно так наивно устанавливать SEH в процедуре ?! У тебя же в Start в конце стоит "невидимый" ret который все портит. Если уж хочешь в процедуре, то нужно делать вот так:
    Код (Text):
    1. procedure Start;
    2. asm
    3.   pop eax    ;сохраняем адрес возврата из процедуры
    4.   push offset _except_handler
    5.   push dword ptr fs:[0]
    6.   mov fs:[0], esp
    7.   push eax   ;восстанавливаем адрес возврата
    8. end;
    Тоже самое ес-но нужно сделать и в Stop