qt-嵌入其他exe文件

近期有一个这样的问题困扰着我,就有一个别人写的软件,我需要在qt里面嵌入这个软件,同时执行这个软件。

如何实现呢?

现在我写一个简单的被嵌入软件A.exe,假设A软件代码很简单,就是打印A软件带的参数。比如像下面这样的exe程序:

qt-嵌入其他exe文件_第1张图片

这里我只是以A.exe打个比方而已。然后如何将此软件嵌入qt的图形界面呢?

我们需要新建一个QT Widgets Application工程,取名为InsertAPP,然后在图形界面里添加一个按钮,取名为“执行APP”,增加一个QLineEdit用来填充A.exe的后面的参数,如下图:

qt-嵌入其他exe文件_第2张图片

然后在“执行APP按钮”添加槽函数,如下:

qt-嵌入其他exe文件_第3张图片

到这里,qt的UI就结束了。只需要在void MainWindow::on_pushButton_clicked()函数里填充一些代码就好了。

怎么将A.exe包含在我们的InsertAPP工程里呢?我们这里将A.exe作为一个资源文件添加进工程里,然后重新生成。添加路径为右击qt项目InsertAPP >> 添加新文件 >> Qt文件和类下的Qt Resource File >> 命名exe(也可以命其他的),然后发现工程下面出现了一个“资源”的文件夹,右击此文件夹选择“添加现有文件…”,将A.exe选中确认。过程如下:

 

这里就将A.exe作为资源文件添加到工程里了。需要注意的一点是A.exe必须在InserAPP工程文件夹下,尽量文件路径不含中文。

接下来只需要在mainwindows.cpp里添加一些头文件和实现void MainWindow::on_pushButton_clicked()函数就行。

例如我添加的头文件有:

#include "qmessagebox.h"
#include "QFile"

实现void MainWindow::on_pushButton_clicked()函数为:

    QString EXEName_src = ":/exe/A.exe";
    QString EXEName_Dst = "~A.exe";
    QFile EXEFile_src(EXEName_src);
    QFile EXEFile_Dst(EXEName_Dst);
   //对资源里的exe进行重新生成
    if(EXEFile_Dst.open (QIODevice::WriteOnly)){
       if(EXEFile_src.open(QIODevice::ReadOnly)){
       QByteArray tmp = EXEFile_src.readAll();
       EXEFile_Dst.write(tmp);
       }
    }
    EXEFile_Dst.close();

    QString EXEPara = ui->lineEdit->text(); //获取参数

    if (EXEPara.isEmpty()){
        QFile::remove(EXEName_Dst); //删掉exe文件
        QMessageBox::about(this,"Error","确保程序参数存在!!!");
        return;
    }

    QString CMD = EXEName_Dst + " " + EXEPara;
    //执行CMD命令
    char* ptr;
    QByteArray ba = CMD.toLocal8Bit(); //支持含中文
    ptr = ba.data();
    system(ptr);

   QFile::remove(EXEName_Dst); //删掉exe文件

我们需要查询A.exe作为资源文件在InsertAPP工程下的路径,查询直接在“资源”文件夹下右击A.exe选择copy path...,然后将路径替换到QString EXEName_src = ":/exe/A.exe";此句中即可。

然后运行此工程,如果步骤正确的话会出现以下界面:

qt-嵌入其他exe文件_第4张图片

如果编译出问题,自己调试以下,一般问题不大。附上此工程的链接(此工程下的A.exe无毒,360喜欢误报,如担心也可以替换成自己的exe进行测试)。QT版本为5.4.0,QT Creator版本为3.3.0。

qt-嵌入其他exe文件_第5张图片

你可能感兴趣的:(Qt工程)