博主将两个软件进行通信是因为项目中出现调用的库只有32位的DLL和LIB,而自己写的软件却是64位,导致我的软件无法使用这个库,让我没办法控制。然后想到解决方法是写一个专门的32位软件调用这个库,然后通过与我现在写的软件进行通信,类似信号和槽的操作。
关于QT RemoteObeject的详细使用可以看QT助手,这里我简单的讲一下。
一.使用QT RemoteObeject首先创建需要的rep文件,rep文件可以先用txt文档写好再更改后缀即可。
这是我需要使用的是信号和槽,先在txt写好,文本格式使用UFT-8。(注意:写的时候不要加任何分号,不然会导致后面编译rep文件不成功。根据写代码风格,会习惯的添加分号,这个问题也困扰博主几个钟才发现是分号引起编译不成功)
写好txt更改后缀名并将文件放进项目代码下(对于代码管理有要求的可以创建文件单独放置rep文件)
二.编译rep文件(rep文件分客户端(REPLICA)和服务端(SOURCE))
因为博主写代码使用的是VS2019 IDE不会怎么操作编译生成rep文件就采取了比较曲折的方法(如果有会用VS编译rep文件的小伙伴也可以教教我)。
1.我这里先编译服务端(SOURCE)的rep。
在项目文件的Pro添加这两个圈住的必须的东西(QT += remoteobjects和REPC_SOURCE += iocontrol.rep(你要编译的rep文件名),如果你的rep是放进新建文件夹放的要指定相对位置,不然可能编译不成功)
2.编译操作
对文件先进行qmake,再进行构建,如果成功rep文件会自动添加近你的项目中
这里是编译成功了,然后你打开他们编译生成文件会多了一个rep_你的rep文件名_source.h文件
3.编译客户端(REPLICA)的rep(新建一个新的项目)
注意他们的pro文件夹有个地方不同
这里使用的是 REPC_REPLICA,然后进行上面先qmke,再构建,你就会发现这里也有一个rep_你的rep文件名_replica.h文件
好了,最重要的两个文件已经弄好了,接下来通过这两个文件将他们连接在一起。
三.使用QT RemoteObject最重要的部分
我这里简单说一下,我这个32位软件是用QT写的,主项目是用VS2019写的。
1.首先我先将我这个32位软件的代码,我这个32位使用的是replica.h的文件
需要调用就要上头文件,这里需要上的头文件就是画线的那两个,懂得都懂。
接下来在构造函数里面用connect将他们关联起来
前三行对着写就行,connect这里的m_IoWrite8,m_IoRead8是不是很熟悉?这就是我们在txt上写的。说到这里很聪明的人就大概知道原理了,还不清楚的聪明人继续往下看。
下面设置我们的服务端,就是我的这个主项目怎么把这个信号传过去。
首先我们需要给我的vs项目属性添加上这两个
然后我将生成的rep_你的rep文件名_source.h文件,放进我的VS项目下面,
然后将他添加进项目里面后编译。
接下来我们需要创建一个类继承我们写在rep文件里面的类
带vitual都是我们写rep文件时的定义的,这里SLOT槽函数必须都要在我们新建的这个类中定义不然会报错。
这个m_IoWrite8和m_IoRead8是不是另外那个32位软件需要的信号。
下面就是将他们两个两个exe连接在一起的代码,前4行是打开那个exe的路径,接下来四行是连接两个exe代码
进行connect信号槽了,这样就大功告成了。
为什么那两个rep文件这么重要,因为他们是联系两个exe的中间媒介。
提示:
1.因为你是命令这个exe运行指定代码的,所以你需要将这个exe打开才行,你不打开是无法控制的。
2.我VS使用的rep.h文件是专门在QT那里生成复制到VS下面的。
3.那个调用的exe记得关闭主项目的时候关联关掉,因为我这种打开exe的方式不会随主项目关闭而关闭。
4.我写博文主要以后我忘记怎么使用时看回博客会想起使用方法,也希望可以帮助到一些需要使用的小伙伴。