Справочник по технологии COM
Страница 55. Displnvoke


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);
}

 
Следующая статья »