开发者社区> 问答> 正文

关于Qt调用COM组件参数类型不匹配

COM组件的函数代码(通过dumpcpp导出的代码):
inline bool Core::ReadSDO(int Index, QVariantList*& Buffer, int Count)
{

bool qax_result;
void *_a[] = {(void*)&qax_result, (void*)&Index, (void*)&Buffer, (void*)&Count};
qt_metacall(QMetaObject::InvokeMetaMethod, 22, _a);
return qax_result;

}

测试代码

Core *core = new Core();
QVariantList*& Buffer = new QVariantList();
core->ReadSDO(1, buffer, 1);

执行后 报错:
QAxBase: Error calling IDispatch member ReadSDO: Type mismatch in parameter 1

个人分析:
该组件通过C# 来使用时,ReadSDO方法的第二个参数是传入一个 short类型的数组,而QVariant是无法转换和使用short类型的,个人认为 这是错误关键点。

2018-12-14
经测试发现,问题不是QVariant与short,而是在于数组,只要是传入数组就会报这个警告。

我自己写了一个测试的COM来传递数组又是可以使用的,这是不是意味着上面说的COM组件对应的函数在Qt无法使用?

提问:
Qt如何改变才能使用到该函数呢?有大神路过,又刚好知道如何解决的,请指点指点

Qt该如何才能正确的传入数组到COM?
Qt调用com(C#): QVariantList 对应 object[]

展开
收起
comic-_-|| 2018-12-13 14:59:44 5464 0
3 条回答
写回答
取消 提交回答
  • 大哥,你的问题解决了吗?我现在用Robotinterface遇到和你一样的问题;object->dynamicCall("ReadRDO(int, QVariantList*&, int)", params).toBool();报参数错误;

    请问您怎么解决?

    2021-07-14 10:37:04
    赞同 展开评论 打赏
  • 错误最后是怎么解决的?

    最近也遇到类似问题。目前已经实现QT中的调用com中不含VARIANT类型参数的所有函数且能返回数据;但是通过DynamicCall调用函数含有VARIANT类型的参数(VARIANT *pVal)时系统报错,也不能返回数据。

    2021-03-22 10:56:44
    赞同 展开评论 打赏
  • 使用import引入的方式比较简单,用智能指针来调用 #import "C:\a.dll" no_namespace  // 不知道名字空间的话必须加上no_namespace//在应用程序类的InitInstance函数添加:   CLSID clsid;   CLSIDFromProgID(OLESTR("a.GetRes"),&clsid);   CComPtr<IGetRes> pGetRes;        //智能指针   pGetRes.CoCreateInstance(clsid);   pGetRes->Hello();                   // 调用接口   // 在程序结束,例如Onclose处释放      pGetRes.Release();                CoUninitialize();
    

    答案来源于网络

    2019-10-17 17:53:35
    赞同 展开评论 打赏
问答分类:
C#
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载