Как выбросить exception как в Delphi

Тема в разделе "WASM.BEGINNERS", создана пользователем gershkovich, 25 апр 2006.

  1. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Привет всем!



    Переписываю свою DLL с Delphi на ассемблер.

    Столкнулся с проблемой: как выбросить Exception ???



    На Delphi это выглядит так:
    Код (Text):
    1.  
    2. raise Exception.Create('String is empty');
    3.  




    как это будет выглядеть на ассемблере ?



    Заранее спасибо.
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Компайлишь код в Дельфях и смотришь в дизассемблере. Самый надежный способ. А потом задавай вопросы по тому, что увидишь.
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    crypto

    Если интересно покопаться в потрохах, то проще заглянуть в сорцы system.pas, чем чего то компилить и дизасмить



    gershkovich

    На ассемблере "это" будет выглядеть ужасно ;)



    Само исключение вызывается просто через API функцию RaiseExeption

    Вопрос в том как организована обработка исключения, т.е. что передавать в качестве аргументов в lpArguments.

    В дельфях используются свои навороты, в частности в lpArguments передается указатель на созданный объект Exception, содержащий твою строку. Соответственно стандартный обработчик исключений в дельфях идентифицирует свои "родные" исключения не по ExceptionCode, а по типу объекта Exception, и может выдавать переданную в него строку сообщения



    PS: А стоит ли вообще в dll связываться с исключениями - не проще ли возвращать FALSE и устанавливать SetLastError как это принято в Win API ?
     
  4. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Спасибо, за объяснение.



    В моем случае приходится делать много проверок в одной проц-е, и использовать exception для выхода из нее было очень удобно.



    Для асма, похоже, действительно менее геморойно использовать "if" и "goto".