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 调用上下文的标志。
pparams
指向结构的指针,该结构包含参数数组、命名参数的 DISPID 数组以及数组中元素数的计数。
pvarResult
指向要存储结果的位置的指针;如果调用方不期望结果,则为 Null。 如果指定了DISPATCH_PROPERTYPUT或DISPATCH_PROPERTYPUTREF,则忽略此参数。
pexcepinfo
指向包含异常信息的结构的指针。 如果返回DISP_E_EXCEPTION,应填充此结构。
puArgErr
具有错误的第一个参数的 rgvarg 中的索引。 参数以反向顺序存储在 pdispparams-rgvarg> 中,因此第一个参数是数组中索引最高的参数。 仅当生成的返回值DISP_E_TYPEMISMATCH或DISP_E_PARAMNOTFOUND时,才返回此参数。
返回值
返回代码 | 说明 |
---|---|
|
成功。 |
|
提供给 DISPPARAMS 的元素数不同于方法或属性接受的参数数。 |
|
DISPPARAMS 中的参数之一不是有效的变体类型。 |
|
应用程序需要引发异常。 在这种情况下,应填充 在 pexcepinfo 中传递的结构。 |
|
请求的成员不存在。 |
|
IDispatch 的此实现不支持命名参数。 |
|
DISPPARAMS 中的一个参数不能强制为指定的类型。 |
|
其中一个参数 ID 不对应于 方法上的参数。 在这种情况下, puArgErr 设置为包含错误的第一个参数。 |
|
省略了必需的参数。 |
|
无法强制一个或多个参数。 rgvarg 中类型不正确的第一个参数的索引在 puArgErr 中返回。 |
|
其中一个参数无效。 |
|
内存不足,无法完成操作。 |
还可以返回任何 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 |