C#-winform调用COM组件(COM组件由Qt开发)

举报
DS小龙哥 发表于 2022/12/22 09:19:09 2022/12/22
【摘要】 在项目开发中,需要Qt与C#进行混合编程,完成项目开发。C#这边作为主框架,Qt负责编写插件,将功能模块通过COM组件的形式封装注册,再由C#调用、交互完成最终的项目。

一、场景介绍

在项目开发中,需要Qt与C#进行混合编程,完成项目开发。C#这边作为主框架,Qt负责编写插件,将功能模块通过COM组件的形式封装注册,再由C#调用、交互完成最终的项目。

程序开发环境: win10 64位

编译器: VS2017

Qt版本: Qt5.12.6

二、Qt封装COM组件

2.1 环境介绍

为了方便演示整体流程,我这里先利用Qt新建一个简单的项目,编译成COM组件进行注册,再由C#调用。

我这里Qt程序是在VS2017里+Qt插件进行开发的,主要是在VS里新建ActiveQtServer比较方便,注册个方面都比较容易。

2.2 新建工程

接下来就是新建工程的步骤:

image-20221123150546823

image-20221123150658164

image-20221123150718620

image-20221123150836256

到此,一个空的工程已经新建完毕。

2.3 空工程编译测试

新建完毕之后,先编译一下,测试工程注册是否正常 。

直接选择项目,右键选择重新生成。

image-20221123150940683

正常情况下,生成最终是提示服务注册成功。

image-20221123152402694

2.4 注册失败问题解决

如果失败,会出现下面这种情况。

image-20221123151032038

失败一般情况是环境变量造成的,也就是说注册的时候,找不到Qt程序需要的相关动态库。 这个问题好解决,直接在生成dll的目录下,利用Qt自带的工具windeployqt.exe搜索一下相关的库,拷贝过来即可。

注意: 如果Qt用到了其他的第三方库,需要自己手动去将相关dll拷贝过来。

在目录下,我们可以看到dll已经生成了。

image-20221123151903542

打开当前Qt使用的编译器窗口,运行工具搜索拷贝动态库。

image-20221123152008536

发布成功:

image-20221123152310584

然后再去注册,即可成功。

image-20221123152443446

2.5 其他注册失败问题总结

注册失败的问题一般有以下情况:

(1)用到的dll找不到,确定所需要的dll是不是都在当前目录下。

(2)被电脑安全软件拦截了,关闭360这些安全软件

(3)代码里有问题,检查构造函数和析构函数代码,特别是析构函数,检查是否有空指针,非法内存访问之类的问题,如果找不到语法问题,可以将构造函数和析构函数代码部分屏蔽,进行测试。寻找问题。

2.6 增加功能

为了方便测试, 这边Qt里设计一个简单的界面,开放1个公共接口出去,方便C#调用,进行交互测试。

界面加了一个标签控件,要实现的效果是,C#调用开发的接口,可以修改这个标签控件的内容。

image-20221123160750285

增加代码:

image-20221123160945378

image-20221123161416289

然后编译,注册。

image-20221123161436873

到此,Qt的COM组件已经注册成功。 对外提供了一个set_text方法,外部可以调用set_text 这个方法,修改UI界面上标签控件显示的数据。

三、C#建立工程调用COM组件-winform

3.1 新建项目

image-20221123164458257

image-20221123164539996

打开工具箱。

image-20221123164622771

选择常规,鼠标右键,选择 选择项

image-20221123164659956

找到刚才注册的COM组件,选择。 (名字就是刚Qt工程的名字)。

image-20221123164928395

选择之后,拖到界面的控件效果如下: 就是刚才Qt开发的组件。

image-20221123165047696

3.2 测试接口调用

先运行正常拖拽之后的效果:

image-20221123165643143

然后,调用组件的接口,修改内容。

image-20221123165735897

写代码,调用接口。

image-20221123170344684

运行效果:

image-20221123170405676

3.3 运行64位程序

默认新建的工程都是x86,如果COM组件是64位的,那么C#这边也可以运行64位程序去调用。

在属性里找到设置,去掉首选32位即可。

image-20221123170650491

3.4 打开控制台

在调用QT的组件过程中,肯定少不了调试,经常需要进行查看控制台的输出找问题。

打开控制台看Qt组件的输出。

在属性里找到应用程序,修改输出类型为控制台即可。

image-20221123170945449

image-20221123171052896

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。