Автоматически вызывает функции-члены по информации о типе для интерфейса. Вы можете описать интерфейс с помощью информации о типе и реализовать IDispatch::Invoke одним вызовом этой Displnvoke.
HRESULT Displnvoke ( void FAR* _this, ITypelnfo FAR* ptinfo, DISPID dispidMember, unsigned short wFlags, DISPPARAMS FAR*pparams, VARIANT FAR* pvarResult, EXCEPWFO pexeepinfo, unsigned int FAR* puArgErr );
Параметры:
Значение | Описание |
---|---|
DISPATCH_METHOD | Член вызывается как метод. Если свойство имеет то же самое имя, то могут быть установлены и этот флаг, и флаг DISPATCH_PROPERTYGET. |
DISPATCH_PROPERTYGET | Член считывается как свойство или элемент данных. |
DISPATCH PROPERTYPUT | Член изменяется как свойство или элемент данных. |
DISPATCH_PROPERTYPUTREF | Член изменяется путем присваивания ссылки, а не значения. Данный флаг допустим только тогда, когда свойство допускает ссылку на объект. |
Код возврата | Значение |
---|---|
S_OK | Успех. |
DISP_E_BADPARAMCOUNT | Число аргументов в DISPPARAMS отличается от фактического числа аргументов метода или свойства. |
DISP_E_BADVARTYPE | Один из аргументов в DISPPARAMS имеет неверный тип варианта. |
DISP_E_EXCEPTION | Приложению необходимо возбудить исключение. В данном случае структура pexcepinfo должна быть заполнена. |
DISP_E_MEMBERNOTFOUND | Запрошенный член не существует. |
DISP_E_NONAMEDARGS | Данная реализация IDispatch не поддерживает именованные аргументы. |
DISP_E_OVERFLOW | Один из аргументов в DISPPARAMS невозможно привести к заданному типу. |
DISP_E_PARAMNOTFOUND | Один из DISPID параметров не соответствует ни одному из параметров метода. В данном случае puArgErr устанавливается на первый аргумент, вызвавший ошибку. |
DISP_E_PARAMNOTOPTIONAL | Не задан обязательный параметр. |
DISP_E_TYPEMISMATCH | Приведение типа для одного или нескольких аргументов невозможно. Индекс первого параметра в массиве rgvarg, имеющего неверный тип, возвращается в puArgErr. |
E_INVALIDARG | Один из параметров неверен. |
E_OUTOFMEMORY | Не хватает памяти для выполнения операции. |
Другие | Могут также возвращаться любые коды возврата ITypeInfo::Invoke. |
Комментарии:
Параметр _this представляет собой указатель на реализацию интерфейса, к которому выполняется обращение. Displnvoke строит стековый фрейм, преобразует параметры по стандартным правилам приведения типов, помещает их в стек и затем вызывает соответствующую функцию-член в VTBL.
Пример:
Следующий код из примера Lines (файл Lines.cpp) реализует IDispatch::Invoke с помощью Displnvoke. Эта функция использует m_bRaiseException для сигнализации о том, что во время вызова Displnvoke произошла ошибка.
STDMETHODIMP CLines::Invoke ( DISPID dispidMember, REFIID riid, LCID Icid, WORD wFlags, DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr) { return DispInvoke( this, m_ptinfo,dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); }