com:pDispatch->invoke() 时参数数量无效
com: Invalid number of parameters when pDispatch->invoke()
由于某些原因,我必须在代码中使用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;
[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,还要求跨单元边界正确封送调用。这是返回失败错误代码的唯一方法。
VARIANT pVarResult;
EXCEPINFO pExceptInfo;
UINT pArgErr;
hResult = pDispatch->Invoke(id, IID_NULL,
LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD, &pParams, &pVarResult, &pExceptInfo, &pArgErr);
尝试提供其他参数
感谢大家抽出时间
造成这个问题是我的愚蠢错误。因为我使用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之间添加逗号。
相关文章:
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 如何在模板函数中实例化其长度使用模板参数的数组
- 基于参数创建数组
- Pybind11 默认参数 numpy 数组或 None
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 更改为参数的数组的值
- 根据 C++11 中的模板参数选择数组大小
- 是否可以使用C 函数中的const int参数创建数组
- 根据参数将数组分成 5 个不同的数组
- 你究竟如何通过函数的参数传递数组?
- 函数参数中数组大小未指定
- 数组作为函数参数查找数组长度时出错
- 如何使用函数参数设置数组大小
- 可变参数模板数组调用未定义的行为
- 提升 1.55,而 13 信号参数错误数
- 指向作为模板参数的数组的指针
- C++可变参数模板数组/访问元素
- 在 c++ 中没有参数的数组
- 具有双精度参数的数组
- 使用 C++11 的 begin() 和 end() 函数通过参数确定数组维度