Страница 55 из 111
Displnvoke Автоматически вызывает функции-члены по информации о типе для интерфейса. Вы можете описать интерфейс с помощью информации о типе и реализовать 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 );
Параметры: - _this - Указатель на реализацию интерфейса IDispatch, которую описывает ptinfo.
- ptinfo - Указатель на информацию о типе, описывающую интерфейс.
- dispidMember - Задает вызываемый член. Для определения значения DISPID используйте GetlDsOfNames или документацию к объекту.
- wFlags - Флаги, описывающие контекст вызова Invoke:
Значение | Описание | DISPATCH_METHOD | Член вызывается как метод. Если свойство имеет то же самое имя, то могут быть установлены и этот флаг, и флаг DISPATCH_PROPERTYGET. | DISPATCH_PROPERTYGET | Член считывается как свойство или элемент данных. | DISPATCH PROPERTYPUT | Член изменяется как свойство или элемент данных. | DISPATCH_PROPERTYPUTREF | Член изменяется путем присваивания ссылки, а не значения. Данный флаг допустим только тогда, когда свойство допускает ссылку на объект. | - pparams - Указатель на структуру, содержащую массив аргументов, массив DISPID для именованных аргументов и счетчик элементов в массивах.
- pvarResult - Указатель, по которому должен возвращаться результат, или NULL, если вызывающий не ожидает возврата результата. Если задано DISPATCH_PROPERTYPUT или DISPATCH_PROPERTYPUTREF, данный аргумент игнорируется.
- pexcepmfo - Указатель на структуру, содержащую информацию об исключении. Если возвращается DISP_E_EXCEPTION, эта структура должна быть заполнена.
- puArgErr - Индекс в rgvarg, соответствующий первому аргументу, который вызвал ошибку. Аргументы хранятся в pdispparams->rgvarg в обратном порядке, так что первому аргументу соответствует наибольший индекс массива. Значение параметра возвращается только в том случае, если код возврата равен DISP_E_TYPEMISMATCH или DISP_E_PARAMNOTFOUND.
Код возврата | Значение | 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); }
|