描述:
对IDispatch::Invoke method 不熟悉,照着MSDN上的说明写了这样的调用,无法得到我想要的东西,恳请各位高手指点,在此谢过!!
我想取出IDL文件中Iocls接口下的方法“SI2”的方法的返回值:
SI2 方法定义:
SI2(SHORT BVI2, SHORT* BRI2, SHORT* pVal)
Invoke方法:
......
hr = cls1->QueryInterface(IID_IDispatch, (LPVOID*)&obj); //cls1为指向接口Iocls的指针
DISPPARAMS params;
params.cArgs = 3;
params.cNamedArgs = 3;
if(SUCCEEDED(hr))
{
//因为SI2有三个参数。。
params.rgvarg = new VARIANT[params.cArgs];
params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].llVal = 0;
params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].llVal = 5;
params.rgvarg[1].vt = VT_I2;
params.rgvarg[1].llVal = 5;
VARIANT shortVal;
VariantInit(&shortVal);
DISPID dispid;
OLECHAR FAR* szMember = L"SI2";
hr = obj->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid); //hr = S_OK;
hr = obj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, ¶ms, &shortVal, NULL, NULL); //hr = 0x8002000e Invalid number of parameters.
}
......
请问各位: Invoke参数哪儿处理的不对?
解决方案1:
应该只有两个参数,返回值是通过Invoke的pVarResult来接收的
解决方案2: params.cNamedArgs = 3;
把3换成0或者1试试,具体含义我忘记了,楼主也可以查一下。
params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].llVal = 0;
params.rgvarg[1].vt = VT_I2 | VT_BYREF;
params.rgvarg[1].llVal = 5;
params.rgvarg[2].vt = VT_I2;
params.rgvarg[2].llVal = 5;
这样
params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].llVal = 0;
params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].llVal = 5;
params.rgvarg[1].vt = VT_I2;
params.rgvarg[1].llVal = 5;
三个参数,params.rgvarg的下标应该是从[0]到[2],而不是只有[0]和[1]。
您可能想查找下面的文章:
- 实现了IDispatch接口的组件和ActiveX控件用起来有什么不同呢?我觉得一样可以用在Web页面上,为什么ActiveX控件还要多实现那么多各种各样
- 实现了IDispatch接口的组建,用vbscript怎么调用?
- IDispatch::Invoke如何通过dispid调用方法?
- 关于idispatch和typelib
- 问个弱弱的问题:得到一个ActiveX控件的IDispatch指针后,如何使用?有没有与CListCtrl相同的ActiveX控件?
- MSFlexGrid有一个Picture属性,是一个IDispatch接口指针,请问如何操作?
- 请教COM,IDispatch相关问题!
- 制作弹出广告拦截器时碰到问题,关于OnNewWindow2IDispatchppDisp,BOOLCancel的
- [关于IDispatch问题]:如何将tlb文件编译进dll中?高分求救
- 请问一下:COM组件(TLB)中使用IDispatch和CoInitialize两种方法有何不同?谢谢啦