Hello,
I wrote a plugin which have to run 24/7. But sometimes the client crashes and until I found/fixed the error I want to write a little application which starts the client, log its stdout and stderr and restart the client on crash.
I program with C++ and Qt 5.3 and wanted to use QProcess. But when it should start the TeamSpeak 3 Client it just outputs the error "Process failed to start: Insufficient permissions to invoke the program."
This problem is TeamSpeak dependent, not c++ or Qt. When I pass "calc.exe" or "7zFM.exe" as argument my program runs without any problem. To use my program with TeamSpeak 3 I pass "C:\Users\Psy-Kai\AppData\Local\Team Speak 3 Client\ts3client_win64.exe" (where my TeamSpeak is located).
Here my code:
(main.c)
Code:
#include <QCoreApplication>
#include <QTimer>
#include "maincontroller.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MainController c;
QTimer::singleShot(0, &c, SLOT(run()));
return a.exec();
}
(maincontroller.h)
Code:
#ifndef MAINCONTROLLER_H
#define MAINCONTROLLER_H
#include <QCoreApplication>
#include <QProcess>
class MainController : public QObject
{
Q_OBJECT
enum QProcessSignal
{
ERROR = 0,
FINISHED,
READYREADSTANDARTERROR,
READYREADSTANDARTOUTPUT,
STARTED,
STATECHANGED
};
public:
explicit MainController();
public slots:
void run();
private:
void quitApplication();
QProcess process_;
private slots:
void processError(QProcess::ProcessError error);
void processFinished(int exit_code, QProcess::ExitStatus exit_status);
void processReadyReadStandartError();
void processReadyReadStandartOutput();
void processStarted();
void processStateChanged(QProcess::ProcessState new_state);
};
#endif // MAINCONTROLLER_H
(maincontroller.cpp)
Code:
#include "maincontroller.h"
#include <stdint.h>
#include <QDir>
#include <QDebug>
#include <QThread>
#include <QFileInfo>
MainController::MainController() :
QObject()
{
QObject::connect(&process_, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));
QObject::connect(&process_, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(processFinished(int, QProcess::ExitStatus)));
QObject::connect(&process_, &QProcess::readyReadStandardError, this, &MainController::processReadyReadStandartError);
QObject::connect(&process_, &QProcess::readyReadStandardOutput, this, &MainController::processReadyReadStandartOutput);
QObject::connect(&process_, &QProcess::started, this, &MainController::processStarted);
QObject::connect(&process_, &QProcess::stateChanged, this, &MainController::processStateChanged);
}
void MainController::run()
{
QStringList arguments(QCoreApplication::arguments());
if (arguments.count() > 0)
{
const QString app_name(QFileInfo(QCoreApplication::applicationFilePath()).fileName());
if (QFileInfo(arguments.at(0)).fileName().compare(app_name) == 0)
{
arguments.removeFirst();
}
if (arguments.count() < 1)
{
quitApplication();
}
else
{
QFile programm(arguments[0]);
if (programm.exists())
{
process_.setProgram(arguments[0]);
arguments.removeFirst();
process_.setArguments(arguments);
process_.start();
}
else
{
qWarning() << "Programm" << programm.fileName() << "not found.\nGonna end.";
QCoreApplication::quit();
}
}
}
else
{
quitApplication();
}
}
void MainController::quitApplication()
{
qWarning() << "No arguments passed. Gonna end.";
#ifdef Q_OS_WIN
qWarning() << "Usage: .\\Programm_Watcher.exe /\"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe\"";
#else
qWarning() << "Usage: ./Programm_Watcher \"/bin/bash\""
#endif
QCoreApplication::quit();
}
void MainController::processError(QProcess::ProcessError error)
{
qDebug() << "Process" << process_.program() << "| Processsignal" << ERROR << "|" << "Error occurred:" << error << "-" << process_.errorString();
}
void MainController::processFinished(int exit_code, QProcess::ExitStatus exit_status)
{
qDebug() << "Process" << process_.program() << "| Processsignal" << FINISHED << "|" << "Finished. Exitcode:" << exit_code << "- Exitstatus:" << exit_status;
qDebug() << "Gonna restart process" << process_.program() << "in";
for (int32_t i(5); i>0; i--)
{
qDebug() << ".." << i;
this->thread()->sleep(1);
}
process_.start();
}
void MainController::processReadyReadStandartError()
{
qDebug() << "Process" << process_.program() << "| Processsignal" << READYREADSTANDARTERROR << "|" << "Data from stderr:" << process_.readAllStandardError();
}
void MainController::processReadyReadStandartOutput()
{
qDebug() << "Process" << process_.program() << "| Processsignal" << READYREADSTANDARTOUTPUT << "|" << "Data from stdout:" << process_.readAllStandardOutput();
}
void MainController::processStarted()
{
qDebug() << "Process" << process_.program() << "| Processsignal" << STARTED << "|" << "Started.";
}
void MainController::processStateChanged(QProcess::ProcessState new_state)
{
qDebug() << "Process" << process_.program() << "| Processsignal" << STATECHANGED << "|" << "State changed:" << new_state;
}
Edit 1:
If you can help me but want to ensure I am not writing a spam-bot (because oft the 24/7 client uptime) PN me and I will show you what my Plugin does