Что должен возвращать IDispatch::Invoke?

Обсуждение вопросов, касающихся указанной технологии.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Что должен возвращать IDispatch::Invoke?

Сообщение ger_kar » 25.10.2015 (Вс) 10:37

Всем привет. При реализации IDispatch возник такой вопрос. Собственно понятно что Invoke должен возвращать как и все методы HRESULT, вопрос в другом. Дело в том, что Invoke это всего лишь посредник, вызывающий другие методы, эти методы в свою очередь тоже должны возвращать HRESULT. И вот вопрос как раз в том, что нужно ли при реализации Invoke возвращать HRESULT других методов, или же возвращаются свои специфические значения? Т.е. нужно ли делать цепочку RetValue = <- Invoke <- Method <- HRESULT ?
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что должен возвращать IDispatch::Invoke?

Сообщение Хакер » 26.10.2015 (Пн) 0:48

ger_kar писал(а):Дело в том, что Invoke это всего лишь посредник, вызывающий другие методы, эти методы в свою очередь тоже должны возвращать HRESULT.


Это в корне неверно. Дальнейшие рассуждения не верны как следствие.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Что должен возвращать IDispatch::Invoke?

Сообщение ger_kar » 26.10.2015 (Пн) 6:25

Что неверно? Что все методы основанные на IDispatch должны возвращать HRESULT? Так они все так и объявлены. Все до единого. Так в чем тут я не прав?
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что должен возвращать IDispatch::Invoke?

Сообщение Хакер » 26.10.2015 (Пн) 8:37

Сама по себе фраза «методы основанные на IDIspatch» — бессмыслица. И запятой не хватает.
Так что вообще непонятно теперь, о чём ты говоришь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Что должен возвращать IDispatch::Invoke?

Сообщение ger_kar » 26.10.2015 (Пн) 8:43

Пока суть да дело я уже сделал цепочку RetValue = <- Invoke <- Method <- HRESULT. Т.е. Invoke вызывает метод, получает его результат выполнения в виде HRESULT, и далее возвращает это значение процедуре вызвавшей Invoke.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что должен возвращать IDispatch::Invoke?

Сообщение Хакер » 26.10.2015 (Пн) 20:23

А теперь выкини эту дрянь. Потому что это абсолютно неверно.

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.

Ты написал дурь. Иди переписывай.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Что должен возвращать IDispatch::Invoke?

Сообщение ger_kar » 26.10.2015 (Пн) 20:35

Ну вот и прояснилась концепция.
Спасибо. Пошел...
Бороться и искать, найти и перепрятать


Вернуться в OLE / COM / ActiveX

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList