tyomitch » 22.08.2007 (Ср) 16:02
Похоже, что это не баг, а фича. (В VB6 вопроизвелось полностью.)
1. Вызов внешнего метода возращает неудачный HRESULT
2. Рантайм вызывает GetErrorInfo и ныкает полученные данные куда-то к себе
3. Рантайм видит, что обработчика ошибок не стоит, и готовится переслать ошибку выше, для чего вызывает SetErrorInfo с теми же данными
4. Рантайм перед выходом из VB-метода очищает все его переменные
5. В одной из них лежит объект с очень сложным деструктором, в котором происходит и обрабатывается ряд исключений.
6. После очистки переменных, данные о произошедшем исключении, записанные вызовом SetErrorInfo, оказываются стёртыми.
7. Теперь метод выходит с неудачным HRESULT
8. Dispatch-обёртка внутри рантайма вызывает GetErrorInfo, обламывается, и оставляет ExcepInfo пустым
Видимо, это сделано затем, чтобы ошибка изнутри деструктора объекта, удаляемого по другой ошибке (double-fault), перезаписывала ExcepInfo своими данными, и тем самым вызвавшая сторона получала бы информацию о последней возникшей ошибке.