找回密码
 立即注册
收起左侧

Qt 程序作为模块被非 Qt 程序加载调用问题

5
回复
5953
查看
[复制链接]

尚未签到

来源: 2018-9-30 14:11:15 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 jiajia_deng 于 2018-9-30 15:25 编辑

      最近一直在跟 Qt 打交道,分别实现了一个用 Qt 截图和用 Qt 核心库 QNetwork 来实现本地文件 P2P 传送文件的功能。两个功能都以模块的形式被不同平台的程序调用起来。这中间遇到了一个比较难缠的问题:

      在作为模块的 Qt 程序导出函数中,必须创建一个 QCoreApplication 实例并调起 exec() 方法来让 Qt 程序可以正常工作,而 exec() 会阻塞当前被调用者线程,并且 Qt 内部的 QCoreApplication 不可能在调用方实现。我们也曾想过在外部创建一个线程来加载用 Qt 开发的模块,但是这明显不是一个明智的做法,我们制作出来的库希望通用性更高,不应该要求调用者必须单独创建一个线程来加载 Qt 模块。

      这中间我们也尝试在 Qt 程序内部创建一个单独的线程来创建 QCoreApplication 并调用 exec 方法,但是会出现各种各样的错误,其中会明确的提示不应该在不同线程中发送和接收数据。

      不知道大家有没有遇到过类似问题?是如何处理或者有什么这种方案吗?

最佳答案

查看完整内容

那进程间通信呢(把您封装的dll改为exe,然后被调用者直接用命令行参数方式调用,将调用结果以进程间通信的方式返回)。 方案2:webservice,将被调用的功能封装为webservice,然后调用者使用webservice接口调用。 这两个方案都比较麻烦,但是希望能对您有所帮助。
回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-9-30 14:11:16 显示全部楼层
jiajia_deng 发表于 2018-10-9 13:38
这样是不行的,至少信号和槽是不能使用的。

那进程间通信呢(把您封装的dll改为exe,然后被调用者直接用命令行参数方式调用,将调用结果以进程间通信的方式返回)。
方案2:webservice,将被调用的功能封装为webservice,然后调用者使用webservice接口调用。
这两个方案都比较麻烦,但是希望能对您有所帮助。
回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-9-30 22:22:10 显示全部楼层
如果把被调用者封装成dll呢,是否不影响您的功能?
回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-10-1 21:14:29 显示全部楼层
baizy77 发表于 2018-9-30 22:22
如果把被调用者封装成dll呢,是否不影响您的功能?

抱歉,误解了您的意思了。您指的是dll提供的功能内部必须使用QCoreApplication,而它不允许在调用方使用。如果不调用QCoreApplication的exec(),而只是初始化一个QCoreApplication的对象呢,不知道是否对您的功能有影响?
回复

使用道具 举报

尚未签到

2018-10-9 13:38:27 显示全部楼层
baizy77 发表于 2018-10-1 21:14
抱歉,误解了您的意思了。您指的是dll提供的功能内部必须使用QCoreApplication,而它不允许在调用方使用 ...

这样是不行的,至少信号和槽是不能使用的。

点评

那进程间通信呢(把您封装的dll改为exe,然后被调用者直接用命令行参数方式调用,将调用结果以进程间通信的方式返回)。 方案2:webservice,将被调用的功能封装为webservice,然后调用者使用webservice接口调用。  详情 回复 发表于 2018-10-9 21:49
回复

使用道具 举报

尚未签到

2018-10-11 09:34:13 显示全部楼层
baizy77 发表于 2018-10-9 21:49
那进程间通信呢(把您封装的dll改为exe,然后被调用者直接用命令行参数方式调用,将调用结果以进程间通信 ...

谢谢,方案是可行的,但是不太适合我们团队的要求。谢谢您的建议了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了