当前位置: 首页 > 知识库问答 >
问题:

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

白芷阳
2023-03-14

我目前正在尝试使用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, 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, 0, functionName, -1, szName, 256, NULL, NULL);
    CheckHResult(App.pdispVal->GetIDsOfNames(IID_NULL, &functionNamePtr, 1, LOCALE_USER_DEFAULT, &dispID) ,szName , dispID);
    CheckHResult(App.pdispVal->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params, &result, NULL, NULL), szName , 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。由于其他原因,如果我将所有变量vartype'semphasized文本设置为VT_EMPTY,它可以工作,但是我没有从结果变量返回任何东西。

有没有可能我试图驱动的软件的activeX实现是错误的?我是不是做错了什么?!

共有1个答案

贺经纶
2023-03-14

当构建DISPPARAMS来设置一些args时,您需要按照调用的相反顺序对它们进行排序。在我的情况下:

//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是我的变体数组的最后一个变体。

 类似资料:
  • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

  • 我找到了一些很好的SO链接(如何从异步回调函数返回值?以及从node.js中的回调函数返回值等),但它们并不是不能为我的问题提供解决方案。 我的问题:能够得到异步调用的结果,但我如何使用这个结果返回我的函数? 这里获取callBackResponse的值为true或false,并希望将该值用作:

  • C++ 数组 C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数,它会生成 10 个随机数,并

  • 我在学习Java剧本MOOC的第一天。 我们正在查看简单的jQuery示例。 有件事我不明白。 像这样的表达式返回元素中的文本。例如,如果对应的html是,则 计算为字符串“hello world”。我希望到目前为止我明白了这一点。而 将文本设置为 ,以便下一次调用 时返回 。 并且,表达式将click函数设置为返回的函数。然而,课程的主讲人没有解释地声称调用click函数并返回。我希望返回一个函

  • 问题内容: 我如何使这个小功能“ imageExists”返回ajax请求是否成功? 问题答案: 我相信您将必须使用同步模式并使用单独的变量来存储返回值。

  • 问题内容: 这个问题已经在这里有了答案 : 如何从异步调用返回响应? (39个答案) 7年前关闭。 我想创建一个JavaScript函数,该函数返回jQuery AJAX调用的值。我想要这样的东西。 我知道我可以通过将async设置为false来做到这一点,但我宁愿不这样做。 问题答案: 使用jQuery 1.5,您可以使用全新的功能,正是为此目的而设计的。 资源

  • C++ 指针 在上一章中,我们已经了解了 C++ 中如何从函数返回数组,类似地,C++ 允许您从函数返回指针。为了做到这点,您必须声明一个返回指针的函数,如下所示: int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第

  • 出于某种原因,在下面的递归函数中, 永远不递增p,也就是说字符串s永远不是一个回文,尽管在我的程序中,s确实是一个回文,次数相当少。但是在下面一行中它仍然返回false 是因为功能吗?s采用的一些值为:aaa、aba、AAAA、abbb、bab 我已确保s中没有前后空格 P、 S:我已经检查过了,x==n 示例输入: 输出0。回文:aaaaaa、abaaba、aaaaaa