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[]
大哥,你的问题解决了吗?我现在用Robotinterface遇到和你一样的问题;object->dynamicCall("ReadRDO(int, QVariantList*&, int)", params).toBool();报参数错误;
请问您怎么解决?
错误最后是怎么解决的?
最近也遇到类似问题。目前已经实现QT中的调用com中不含VARIANT类型参数的所有函数且能返回数据;但是通过DynamicCall调用函数含有VARIANT类型的参数(VARIANT *pVal)时系统报错,也不能返回数据。
使用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();
答案来源于网络
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。