作者: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
参考连接
- http://www.qtcn.org/bbs/simple/?t23559.html
- http://www.javashuo.com/article/p-mxxhuudi-en.html
- https://www.cnblogs.com/Leventure/p/16998111.html
- https://bbs.csdn.net/topics/391932651