DispInvoke 函数 (oleauto.h)

在给定接口的类型信息的情况下,自动在接口上调用成员函数。 可以使用此单个调用来描述具有类型信息的接口,并为接口实现 Invoke

语法

HRESULT DispInvoke(
  void       *_this,
  ITypeInfo  *ptinfo,
  DISPID     dispidMember,
  WORD       wFlags,
  DISPPARAMS *pparams,
  VARIANT    *pvarResult,
  EXCEPINFO  *pexcepinfo,
  UINT       *puArgErr
);

参数

_this

ptinfo 描述的 IDispatch 接口的实现。

ptinfo

描述接口的类型信息。

dispidMember

要调用的成员。 使用 GetIDsOfNames 或对象的文档获取 DISPID。

wFlags

描述 Invoke 调用上下文的标志。

含义
DISPATCH_METHOD
成员作为方法调用。 如果属性具有相同的名称,则可以设置此标志和DISPATCH_PROPERTYGET标志。
DISPATCH_PROPERTYGET
成员作为属性或数据成员进行检索。
DISPATCH_PROPERTYPUT
成员将更改为属性或数据成员。
DISPATCH_PROPERTYPUTREF
成员由引用赋值(而不是值赋值)更改。 仅当 属性接受对 对象的引用时,此标志才有效。

pparams

指向结构的指针,该结构包含参数数组、命名参数的 DISPID 数组以及数组中元素数的计数。

pvarResult

指向要存储结果的位置的指针;如果调用方不期望结果,则为 Null。 如果指定了DISPATCH_PROPERTYPUT或DISPATCH_PROPERTYPUTREF,则忽略此参数。

pexcepinfo

指向包含异常信息的结构的指针。 如果返回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
其中一个参数 ID 不对应于 方法上的参数。 在这种情况下, puArgErr 设置为包含错误的第一个参数。
DISP_E_PARAMNOTOPTIONAL
省略了必需的参数。
DISP_E_TYPEMISMATCH
无法强制一个或多个参数。 rgvarg 中类型不正确的第一个参数的索引在 puArgErr 中返回。
E_INVALIDARG
其中一个参数无效。
E_OUTOFMEMORY
内存不足,无法完成操作。
 

还可以返回任何 ITypeInfo::Invoke 错误。

注解

参数 _this 是指向延迟到的接口实现的指针。 DispInvoke 生成堆栈帧,使用标准强制规则强制参数,在堆栈上推送参数,然后在 VTBL 中调用正确的成员函数。

示例

Lines 示例文件中的以下代码Lines.cpp使用 DispInvoke 实现 Invoke。 此实现依赖于 DispInvoke 来验证输入参数。 为了帮助最大程度地降低安全风险,请包含对输入参数执行更可靠的验证的代码。

STDMETHODIMP
CLines::Invoke(
   DISPID dispidMember,
   REFIID riid,
   LCID lcid,
   WORD wFlags,
   DISPPARAMS * pdispparams,
   VARIANT * pvarResult,
   EXCEPINFO* pexcepinfo,
   UINT * puArgErr)
{
   return DispInvoke(
   this, m_ptinfo,
   dispidMember, wFlags, pdispparams,
   pvarResult, pexcepinfo, puArgErr); 
}

要求

要求
目标平台 Windows
标头 oleauto.h
Library OleAut32.lib
DLL OleAut32.dll

另请参阅

CreateStdDispatch

创建调度 API 函数

IDispatch

IDispatch::Invoke

ITypeInfo::Invoke