COM - C++ 调用函数返回 DISP_E_TYPEMISMATCH

问题描述

我目前正在尝试使用 COM 调用软件的 ActiveX 函数。 这是函数声明:

    [
        id(0xa),helpcontext(0)
    ]
    HRESULT MAIN_GetVersion (
        [out] short* nStatus,[out] BSTR* szStatusMsg,[out] BSTR* szVersion
    );

我是这样做的:

short errorCode = 0;
    BSTR errorMessageBSTR =  SysAllocString(L"test");
    BSTR versionBSTR =  SysAllocString(L"test");

    VARIANT result;
    disPParaMS params = {NULL,NULL,0};
    VARIANTARG args[3];
    
    //First argument : Short*
    Variantinit(&args[0]);
    args[0].vt = VT_I2 | VT_BYREF;
    args[0].piVal = &errorCode;
    //Second argument : BSTR*
    Variantinit(&args[1]);
    args[1].vt = VT_BSTR | VT_BYREF;
    args[1].pbstrVal = &errorMessageBSTR;
    //Third argument : BSTR*
    Variantinit(&args[2]);
    args[2].vt = VT_BSTR | VT_BYREF;
    args[2].pbstrVal = &versionBSTR;
    
    params.rgvarg = args;
    params.cArgs = 3;
    
    disPID dispID;
    char szName[200];
    // Convert down to ANSI
    wchar functionName[] = L"MAIN_GetVersion";
    wchar_t* functionNamePtr = functionName;
    WideCharToMultiByte(CP_ACP,functionName,-1,szName,256,NULL);
    CheckHResult(App.pdispVal->GetIDsOfNames(IID_NULL,&functionNamePtr,1,LOCALE_USER_DEFAULT,&dispID),dispID);
    CheckHResult(App.pdispVal->Invoke(dispID,IID_NULL,LOCALE_SYstem_DEFAULT,disPATCH_METHOD,&params,&result,NULL),dispID);
    /*
    return :
        disP_E_TYPEMISMATCH
            One or more of the arguments Could not be coerced. The index of the first parameter with the incorrect type within rgvarg is returned in puArgErr.
    */

出于某种原因,此代码不起作用并返回 disP_E_TYPEMISMATCH。出于其他原因,如果我将所有 VARIANT vartype 的强调文本设置为 VT_EMPTY,它可以工作,但结果 VARIANT 没有任何回报。

是否有可能我尝试驱动的软件的 activeX 实现是错误的? 我做错了什么吗?!

解决方法

当构建一个 DISPPARAMS 来设置一些 arg's 时,你需要按照它们调用的相反顺序对它们进行排序。就我而言:

//First argument : Short*
VariantInit(&args[2]);
args[2].vt = VT_I2 | VT_BYREF;
args[2].piVal = &errorCode;
//Second argument : BSTR*
VariantInit(&args[1]);
args[1].vt = VT_BSTR | VT_BYREF;
args[1].pbstrVal = &errorMessageBSTR;
//Third argument : BSTR*
VariantInit(&args[0]);
args[0].vt = VT_BSTR | VT_BYREF;
args[0].pbstrVal = &versionBSTR;

short 是我的 VARIANT ARRAY 的最后一个 VARIANT。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...