【发布时间】: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 对象的新手。