try ... catch

Тема в разделе "WASM.BEGINNERS", создана пользователем ltshck, 24 мар 2008.

  1. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    кто нибудь знает как переопределить try { } catch () {} оператор? на с++

    например чтото вроде этого:

    void catch() {
    ....
    }

    operator try() {
    __asm{
    mov eax,catch
    mov fs[0],eax
    }
    }

    есть идеи? чтобы в код можно было вставлять try - catch фрейм но он был не стандартный а "свой"?
     
  2. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    или по другому сформулирую.
    как "помочь" компилятору реализовать

    ___CxxFrameHandler3
    __EH_prolog

    ???


    где найти реализацию этого?
     
  3. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    у.

    нашел.

    ахрененный сайт.

    http://www.wasm.ru/article.php?article=Win32SEHPietrek1
     
  4. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    кому интернесно то надо было так:

    Код (Text):
    1. //==================================================
    2. // MYSEH - Мэт Питрек 1997
    3. // Microsoft Systems Journal, Январь 1997
    4. // FILE: MYSEH.CPP
    5. // To compile: CL MYSEH.CPP
    6. //==================================================
    7. #define WIN32_LEAN_AND_MEAN
    8. #include
    9. #include
    10.  
    11. DWORD  scratch;
    12.  
    13. EXCEPTION_DISPOSITION
    14. __cdecl
    15. _except_handler(
    16.     struct _EXCEPTION_RECORD *ExceptionRecord,
    17.     void * EstablisherFrame,
    18.     struct _CONTEXT *ContextRecord,
    19.     void * DispatcherContext )
    20. {
    21.     unsigned i;
    22.  
    23.     // Сообщаем, что сработал наш обработчик исключений.
    24.     printf( "Hello from an exception handler!\n" );
    25.  
    26.     // Изменяем значение регистра EAX в context record таким образом, чтобы оно
    27.     // указывало на какое-либо, доступное для записи место в памяти.
    28.     ContextRecord->Eax = (DWORD)&scratch;
    29.  
    30.     // Просим ОС еще раз попытаться выполнить вызвавшую исключение инструкцию.
    31.     return ExceptionContinueExecution;
    32. }
    33.  
    34. int main()
    35. {
    36.     DWORD handler = (DWORD)_except_handler;
    37.  
    38.     __asm
    39.     {                      // Создаем структуру EXCEPTION_REGISTRATION:
    40.         push    handler    // Адрес функции обработчика исключений.
    41.         push    FS:[0]     // Адрес предыдущего EXECEPTION_REGISTRATION.
    42.         mov     FS:[0],ESP // Добавляем в связанный список EXECEPTION_REGISTRATION.
    43.     }
    44.  
    45.     __asm
    46.     {
    47.         mov     eax,0      // Обнуляем значение регистра EAX.
    48.         mov     [eax], 1   // Чтобы преднамеренно вызвать исключение, делаем запись
    49.                            // по нулевому адресу.
    50.     }
    51.  
    52.     printf( " After writing!\n" );
    53.  
    54.     __asm
    55.     {                       // Удаляем из связанного списка EXECEPTION_REGISTRATION.
    56.         mov     eax,[ESP]   // Получаем указатель на предыдущий
    57.                             // EXECEPTION_REGISTRATION.
    58.         mov     FS:[0], EAX // Устанавливаем в начале списка предыдущий
    59.                             // EXECEPTION_REGISTRATION.
    60.         add     esp, 8      // Удаляем из стека структуру EXECEPTION_REGISTRATION.
    61.     }
    62.     return 0;
    63. }