اجرای .exe ویندوز در برنامه Qt

وظیفه نوشتن یک برنامه Qt Quick (GUI) برای اپلود سیستم عامل جدید به یک کنترل کننده لمسی بود.
نرم افزار اپلود توسط سازنده در یک برنامه .exe ارائه شده است که یک فایل .bin را بر روی کنترلر لمسی بارگذاری می کند.
من می خواستم از کلاس های Qt "QProcess" استفاده کنم که می تواند برای تماس و کنترل برنامه های پوسته استفاده شود. در سمت لینوکس، من قبلا چندین بار با موفقیت از این استفاده کرده بودم - اما در ویندوز در ابتدا کار نمی کرد.

QProcess::setWorkingDirectory

"ترفند" یا راه حل برای این کار استفاده از "setWorkingDirectory" بود. در اینجا گزیده ای از فایل های .h و .cpp است. لطفا خط "process->setWorkingDirectory..." را در فایل .cpp یادداشت کنید.
cmdlauncher.h

#ifndef CMDLAUNCHER_H
#define CMDLAUNCHER_H

#include <QObject>
#include <QtQuick>
#include <QDebug>
#include <QProcess>
#include <QVariant>
#include <QString>
#include <QDir>

class CmdLauncher : public QProcess
{
    Q_OBJECT

public:
    CmdLauncher(QObject *parent = nullptr);

    Q_INVOKABLE void start(const QString &program, const QVariantList &arguments);

    QString application_directory;
};

#endif // CMDLAUNCHER_H

cmdlauncher.cpp

#include "cmdlauncher.h"

CmdLauncher::CmdLauncher(QObject *parent) : QProcess(parent)
{
    process_running = "start";
}

void CmdLauncher::start(const QString &program, const QVariantList &arguments) {
    QStringList args;

    // convert QVariantList from QML to QStringList for QProcess/
    for (int i = 0; i < arguments.length(); i++)
        args << arguments[i].toString();

    // start request or upload process
    QProcess * process = new QProcess();
    process->setWorkingDirectory(application_directory + "/nConsoleTool");
    process->setProcessChannelMode(QProcess::MergedChannels);
    process->start(program, args);
    process->waitForFinished();

    // get values and set states
    QByteArray bytes = process->readAll();
    cmd_output = QString::fromLocal8Bit(bytes);
    emit cmdOutputChanged();
    }
}

main.qml

import QtQuick 2.9
import QtQuick.Window 2.3
import QtQuick.Controls 2.5
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.3
import CmdLauncher 1.0

ApplicationWindow {
    id: application_window
    visible: true
    width: 1024
    height: 768
    title: qsTr("Firmware Tool")

    CmdLauncher {
        id: launcher
    }

    Button {
        id: nUpdateFW
        x: 260
        y: 20
        width: 200
        height: 30
        text: "Upload Firmware"

        onClicked: {
            //console.log(launcher.application_directory + "/nConsoleTool/nUpdateFW.exe");
            if (file_path == "") {
                fileMissing.open();
            } else {
                launcher.start(launcher.application_directory + "/nConsoleTool/nUpdateFW.exe", [ file_path, "-ba" ]);
                if (launcher.controller_detected == false) {
                    controllerMissing.open();
                }
            }
        }
    }
}

</:code3:></:code2:></:code1:>