【问题标题】:com: Invalid number of parameters when pDispatch->invoke()com: pDispatch->invoke() 时参数数量无效
【发布时间】:2015-10-12 01:49:03
【问题描述】:

出于某种原因,我必须在我的代码中使用 COM 控件。我想调用 COM 控件导出的方法。

idl 文件:

methods: 
    [id(1)] boolean Open(BSTR filepath, BSTR rootname);

cpp 文件:

VARIANT pVarResult;
EXCEPTINFO pExcepInfo;
unsigned int puArgErr;
DISPPARAMS pParams;
memset(&pParams, 0, sizeof(DISPPARAMS));

VARIANTARG param[2];
param[0].vt = VT_BSTR;
param[0].bstrVar = filepath.AllocSysString();
param[1].vt = VT_BSTR;
param[1].bstrVar = rootname.AllocSysString();

pParams.rgvars = param;
pParams.cArgs = 2;
hResult = pDispatch->Invoke(id, IID_NULL, LOCALE_SYSTEM_DEFAULT,  
             DISPATCH_METHOD, &pParams, &pVarResult, &pExcepInfo, &puArgErr);

我收到一条错误消息“参数数量无效”。我的代码哪里错了? 如何将两个字符串参数传递给 com 控件中定义的接口?这似乎是不可能的。

编辑 1:添加更多退货信息。好像没什么用。

pVarResult = NULL;
pExcepInfo.wcode = 52424;
puArgErr = 1;

【问题讨论】:

  • 尝试为结果值 (pVarResult) 提供一个变体。
  • @JonathanPotter pVarResult 在调用后为空

标签: c++ c com mfc activex


【解决方案1】:
  [id(1)] boolean Open(BSTR filepath, BSTR rootname);

您不能使用 IDispatch 调用此函数,它没有正确的签名。仅当函数的返回类型为 HRESULT 时才有效。正确的声明如下所示:

  [id(1)] HRESULT Open(BSTR filepath, BSTR rootname, [out, retval]VARIANT_BOOL* retval);

COM 函数通常对返回 HRESULT 有很强的要求,还需要正确地跨单元边界编组调用。这是返回失败错误代码的唯一方法。

【讨论】:

    【解决方案2】:
    VARIANT pVarResult;
    EXCEPINFO pExceptInfo;
    UINT pArgErr;
    hResult = pDispatch->Invoke(id, IID_NULL,  
          LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD, &pParams, &pVarResult, &pExceptInfo, &pArgErr);
    

    尝试提供其他参数

    【讨论】:

      【解决方案3】:

      感谢大家的宝贵时间。
      造成这个问题是我的愚蠢错误。因为我使用 MFC 库来实现 COM 控件。而在MFC框架中,如果要导出一个接口,就必须使用宏来声明它。像这样。

      DISP_FUNCTION(MyCtrl, "Open", Open, VT_BOOL, VTS_BSTR VTS_BSTR)
      

      我写的是:

      DISP_FUNCTION(MyCtrl, "Open", Open, VT_BOOL, VTS_BSTR, VTS_BSTR)
      

      不应在两个 VTS_BSTR 之间添加逗号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-18
        • 2017-03-27
        • 2018-03-31
        • 2020-03-02
        • 1970-01-01
        • 1970-01-01
        • 2016-07-07
        • 1970-01-01
        相关资源
        最近更新 更多