【问题标题】:IDispatch Invoke() returns Type mismatchIDispatch Invoke() 返回类型不匹配
【发布时间】:2021-03-23 00:02:07
【问题描述】:

我无法成功调用create_session 成员。返回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;
}

我无法弄清楚,这个错误的原因是什么。

【问题讨论】:

  • create_session 似乎是在 IUnknown 接口上定义的方法,因此如果它也派生自 IDispatch,则它是“双重”的。真的吗?为什么不直接调用呢?为什么使用命名参数?无论如何,IDispatch 参数必须从后到前传递:docs.microsoft.com/en-us/previous-versions/windows/desktop/…
  • 这个方法是一个类的成员。但是,谢谢兄弟,它正在工作。非常感谢。贴出来回答。我是 com 对象的新手。

标签: c++ com idispatch


【解决方案1】:

IDispatch::Invoke() method 必须以逆序的参数调用,如官方文档所述:

Implementing IDispatch / Passing Parameters:

参数在数组 rgvarg[ ] 中传递,参数的数量 在 cArgs 中传递的参数。应放置数组中的参数 从最后一个到第一个,所以 rgvarg[0] 有最后一个参数并且 rgvarg[cArgs -1] 有第一个参数。

此外,在您的情况下,您不需要“命名参数”,只需要“位置参数”。如果cNamedArgs 为0,则rgvarg[ ] 的所有元素都表示位置参数。

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多