А теперь выкини эту дрянь. Потому что это абсолютно неверно.
HRESULT, возвращаемый методом Invoke должен обозначать исключительно сбой самого механизма позднего связывания, но ни как (ни в коем случае) не сбой вызываемого метода disp-интерфейса.
Методы disp-интерфейсов
вообще не имеют никакого отношения к концепции HRESULT. Они (методы disp-интерфейсов) стоят от этой концепции далеко и не используют её.
Это в случае ранне-связываемых интерфейсов если его метод возвращает Long и объявлен так:
- Код: Выделить всё
Public Function Method1() As Long
...
End Function
он получит в TLB в описании ранне-связываемого интерфейса такое определение:
- Код: Выделить всё
HRESULT __stdcall Method1([out, retval]long* retval);
и при вызове будет своё «официальное» возвращаемое значение возвращать через последний агрумент, а реально возвращать HRESULT.
Но в случае, когда Method1 будет являться членом disp-интерфейса (а не обычного ранне-связываемого интерфейса), никакого HRESULT-а использовано не будет, он получит в TLB совершенно другое определение:
- Код: Выделить всё
[id(.....)]
long Method1();
При вызове метода disp-интерфейса через IDispatch::Invoke передача вызываемым методом информации об ошибке вызывающей стороне осуществляется
вовсе не через HRESULT, а через структуру
EXCEPINFO, которая во многом походит на VB-шный
Err — в неё заносится код ошибки, текстовое описание, help-файл и прочее.
А сам метод IDispatch::Invoke, если вызываемый метод disp-интерфейса сбойнул, должен возвратить код
DISP_E_EXCEPTION, и ничего другого. А у тебя он возвращает абы-какой HRESULT.
Ты написал дурь. Иди переписывай.