Qt中调用C#制作的com组件

作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

前言

这里记录一下在 Qt 64位程序中调用 C# 制作的 com 组件的流程,方便后期自己回顾。

1. 了解 TLB 格式

拿到的依赖库最重要的有一个 xxx.dll 和一个 xxx.tlb,和一些其他的 dll 依赖库,这里先了解一下什么是 TLB 格式的文件。TLB 文件是对象链接和嵌入(OLE)或 ActiveX 程序的定义文件,通过 TLB 文件,用户可以得知你的 .DLL 文件中的 COM 接口、类、常量等信息。

2. 注册 DLL 到系统中

使用 Windows 的 regsvr32 往系统中注册 com 组件报如下错误

在这里插入图片描述

原因是因为 .net 的 DLL 和非托管的 DLL 的注册方式不一样。非托管的 DLL 注册可以直接在 cmd 中输入 regsvr32 xxx.dll进行注册,但是 .net 的 DLL 需要通过它 .net 自己的工具进行的注册,我们可以在菜单栏中找到 vs 的开发者人员命令行工具

在这里插入图片描述
切换路径到 C:\Windows\Microsoft.NET\Framework\v4.0.30319

在这里插入图片描述

通过 RegAsm.exe xxx.dll命令来注册 .Net 的 DLL
如果是64位的库,则需要切换到 Framework64 下,选择的版本不对应会报 不是有效的 .Net 程序集

在这里插入图片描述

注册成功则如下所示:

在这里插入图片描述

3. 解析 TLB 文件

为了方便在 Qt 中调用,我们借助 dumpcpp 工具生成头文件和源文件,生成的文件编译有可能会报错需要自己修改一下。
1)把 TLB 文件拷贝到 Qt 的目录下,例如 D:\Qt\Qt5.12.8\5.12.8\msvc2017_64\bin
2)命令行执行 dumpcpp xxx.tlb
3)自动生成可以在 Qt 中调用的 .h 和 .cpp 文件,编译报错的话自己修改下,可能是命名空间名称与类名重合了

或者自己去定义一个类,通过 setControl 设置 UUID 的方式来初始化 COM 组件,之后也可以调用里面的函数,需要结合开发文档自己去实现。像这样 ctrl->setControl("{8E27C92B-1264-101C-8A2F-040224009C02}");

4. 在 Qt 中调用

1)构造使用 COM 对象和 ActiveX 控件的 Qt 应用程序,需要向.pro文件中加入
QT += axcontainer

2)导入刚才自动生成的 .h .cpp
3)实例化对象即可调用函数
4)如果出现以下错误,则证明 COM 组件没有注册成功

CoCreateInstance failure (没有注册类)
QAxBase::setControl: requested control {CA69969C-2F27-41D3-954D-A48B941C3BA7} could not be instantiated

参考连接

  1. http://www.qtcn.org/bbs/simple/?t23559.html
  2. http://www.javashuo.com/article/p-mxxhuudi-en.html
  3. https://www.cnblogs.com/Leventure/p/16998111.html
  4. https://bbs.csdn.net/topics/391932651
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值