Поделиться через


Метод IDispatch::Invoke (oaidl.h)

Предоставляет доступ к открытым свойствам и методам объекта. Функция диспетчеризации DispInvoke предоставляет стандартную реализацию Invoke.

Синтаксис

HRESULT Invoke(
  [in]      DISPID     dispIdMember,
  [in]      REFIID     riid,
  [in]      LCID       lcid,
  [in]      WORD       wFlags,
  [in, out] DISPPARAMS *pDispParams,
  [out]     VARIANT    *pVarResult,
  [out]     EXCEPINFO  *pExcepInfo,
  [out]     UINT       *puArgErr
);

Параметры

[in] dispIdMember

Идентифицирует член. Используйте GetIDsOfNames или документацию объекта для получения идентификатора диспетчеризации.

[in] riid

Зарезервировано для будущего использования. Должно быть равным IID_NULL.

[in] lcid

Контекст языкового стандарта, в котором следует интерпретировать аргументы. Lcid используется функцией GetIDsOfNames и также передается в Invoke, чтобы позволить объекту интерпретировать свои аргументы, относящиеся к языковому стандарту.

Приложения, которые не поддерживают несколько национальных языков, могут игнорировать этот параметр. Дополнительные сведения см. в статье Поддержка нескольких национальных языков и Предоставление объектов ActiveX.

[in] wFlags

Флаги, описывающие контекст вызова Invoke .

Значение Значение
DISPATCH_METHOD
Член вызывается как метод . Если свойство имеет одинаковое имя, можно задать как этот, так и DISPATCH_PROPERTYGET флаг.
DISPATCH_PROPERTYGET
Элемент извлекается как свойство или элемент данных.
DISPATCH_PROPERTYPUT
Элемент изменяется как свойство или элемент данных.
DISPATCH_PROPERTYPUTREF
Элемент изменяется с помощью назначения ссылки, а не назначения значения. Этот флаг действителен, только если свойство принимает ссылку на объект .

[in, out] pDispParams

Указатель на структуру DISPPARAMS, содержащую массив аргументов, массив DISPID аргументов для именованных аргументов и число элементов в массивах.

[out] pVarResult

Указатель на расположение, в котором должен храниться результат, или значение NULL, если вызывающий объект не ожидает результата. Этот аргумент игнорируется, если указан DISPATCH_PROPERTYPUT или DISPATCH_PROPERTYPUTREF.

[out] pExcepInfo

Указатель на структуру, содержащую сведения об исключении. Эта структура должна быть заполнена, если возвращается DISP_E_EXCEPTION. Может иметь значение NULL.

[out] puArgErr

Индекс в rgvarg первого аргумента с ошибкой. Аргументы хранятся в pDispParams-rgvarg> в обратном порядке, поэтому первым аргументом является аргумент с наибольшим индексом в массиве. Этот параметр возвращается, только если итоговое возвращаемое значение равно DISP_E_TYPEMISMATCH или DISP_E_PARAMNOTFOUND. Для этого аргумента можно задать значение NULL. Дополнительные сведения см. в разделе Возврат ошибок.

Возвращаемое значение

Этот метод может возвращать одно из этих значений.

Код возврата Описание
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
Один из идентификаторов параметров не соответствует параметру метода . В этом случае параметру puArgErr присваивается первый аргумент, содержащий ошибку.
DISP_E_TYPEMISMATCH
Не удалось привести один или несколько аргументов. Индекс первого параметра с неправильным типом в rgvarg возвращается в puArgErr.
DISP_E_UNKNOWNINTERFACE

Идентификатор интерфейса, переданный в riid, не IID_NULL.
DISP_E_UNKNOWNLCID
Вызываемый член интерпретирует строковые аргументы в соответствии с LCID, а LCID не распознается. Если LCID не требуется для интерпретации аргументов, эту ошибку не следует возвращать.
DISP_E_PARAMNOTOPTIONAL
Обязательный параметр был опущен.

Комментарии

Как правило, не следует реализовывать invoke напрямую. Вместо этого используйте интерфейс диспетчеризации для создания функций CreateStdDispatch и DispInvoke. Дополнительные сведения см. в разделах CreateStdDispatch, DispInvoke, Создание интерфейса IDispatch и Предоставление объектов ActiveX.

Если перед вызовом члена требуется выполнить обработку для конкретного приложения, код должен выполнить необходимые действия, а затем вызвать ITypeInfo::Invoke для вызова элемента. ITypeInfo::Invoke действует точно так же, как Invoke. Стандартные реализации Invoke, созданныеCreateStdDispatch и DispInvoke , откладываются на ITypeInfo::Invoke.

В клиенте ActiveX метод Invoke следует использовать для получения и задания значений свойств или для вызова метода объекта ActiveX. Аргумент dispIdMember идентифицирует вызываемый член. Идентификаторы DISPID, идентифицирующие элементы, определяются реализующим объектом и могут быть определены с помощью документации объекта, функции IDispatch::GetIDsOfNames или интерфейса ITypeInfo .

При использовании IDispatch::Invoke() с DISPATCH_PROPERTYPUT или DISPATCH_PROPERTYPUTREF необходимо специально инициализировать элементы cNamedArgs и rgdispidNamedArgs структуры DISPPARAMS следующим образом:

DISPID dispidNamed = DISPID_PROPERTYPUT;
dispparams.cNamedArgs = 1;
dispparams.rgdispidNamedArgs = &dispidNamed;

Следующая информация предназначена для разработчиков клиентов ActiveX и других пользователей, которые используют код для предоставления доступа к объектам ActiveX. В нем описывается поведение, которое пользователи предоставляемых объектов должны ожидать.

Требования

Требование Значение
Целевая платформа Windows
Header oaidl.h

См. также раздел

IDispatch