IDispatch Invoke()返回类型不匹配 [英] IDispatch Invoke() returns Type mismatch

查看:55
本文介绍了IDispatch Invoke()返回类型不匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法成功调用 create_session 成员.返回类型不匹配

I'm unable to successfully invoke create_session member. It's return Type mismatch

// COM class -> member
virtual HRESULT __stdcall create_session(
        /*[in]*/ BSTR pbszName,
        /*[in]*/ long i32Value ) = 0;

尝试如下调用 create_session 方法:

// test.cpp
HRESULT create_session( IDispatch *dispatch, WCHAR *member ) {
    // WCHAR *member = tlib_help::s2ws( "create_session" );
    DISPID dispid = -1;
    HRESULT hr = dispatch->GetIDsOfNames( IID_NULL, &member, 1, LOCALE_SYSTEM_DEFAULT, &dispid );
    if ( SUCCEEDED( hr ) ) {
        DISPPARAMS *dispparams = new DISPPARAMS( );
        dispparams->cArgs = 2;
        dispparams->cNamedArgs = 1;
        VARIANTARG *rgvarg = new VARIANTARG[dispparams->cArgs];
        rgvarg[0].vt = VARENUM::VT_BSTR;
        rgvarg[0].bstrVal = _bstr_t( "loing_info" );
        rgvarg[1].vt = VARENUM::VT_UI4;
        rgvarg[1].lVal = 12;//i32Value;
        dispparams->rgvarg = rgvarg;
        dispparams->rgdispidNamedArgs = &dispid;
        EXCEPINFO pExcepInfo; UINT puArgErr;
        HRESULT hr;
        VARIANT pVarResult;
        hr = dispatch->Invoke(
            dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
            dispparams, &pVarResult, &pExcepInfo, &puArgErr
        );
        delete dispparams;
        delete[] rgvarg;
    }
    return hr;
}

我无法弄清楚,此错误的原因是什么.

I'm unable to figure it out, what is the reason of this error.

推荐答案

The IDispatch::Invoke() method must be called with parameters in reverse order, as stated in the official documentation:

实现IDispatch/传递参数:

参数在数组rgvarg []中传递,其编号为在cArgs中传递的参数.数组中的参数应放在从最后到第一个,因此rgvarg [0]具有最后一个参数,并且rgvarg [cArgs -1]具有第一个参数.

The arguments are passed in the array rgvarg[ ], with the number of arguments passed in cArgs. The arguments in the array should be placed from last to first, so rgvarg[0] has the last argument and rgvarg[cArgs -1] has the first argument.

此外,在您的情况下,您不需要命名参数",仅需要位置参数".如果 cNamedArgs 为0,则 rgvarg [] 的所有元素都代表位置参数.

Also, in your case, you don't need "named arguments", only "positional arguments". If cNamedArgs is 0, all of the elements of rgvarg[ ] represent positional arguments.

这篇关于IDispatch Invoke()返回类型不匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆