2 Stimmen

QtService übergibt die Startparameter nicht aus dem Service Manager Fenster

So erhalten Sie die Startparameter, die vom Dialogfeld Windows Service Manager übergeben werden. Ich hatte gehofft, ich würde sie als Befehlszeilen-Args an die Hauptfunktion übergeben bekommen.

enter image description here

Wenn ich beim Erstellen des Dienstes die Argumente an binPath übergebe, erhalte ich die Argumente, die an die Hauptfunktion übergeben wurden.

sc create "Myservice" binPath= "Path_to_exe\Myservice.exe -port 18082"

Aber auf diese Weise müssen wir den Dienst jedes Mal deinstallieren und installieren, wenn wir irgendwelche Argumente ändern wollen. Gibt es eine Möglichkeit, die Startparameter in Qt zu erhalten?

Wenn ich den Dienst mit .NET erstelle, kann ich die folgende Funktion verwenden, um diese Startparameter zu erhalten.

 System::Environment::GetCommandLineArgs();

1voto

Antonio Dias Punkte 2663

Ich weiß, dass diese Frage alt ist, aber wie sie unbeantwortet bleibt und das Problem bis heute fortbesteht, halte ich es für angemessen, eine mögliche Antwort zu geben.

Sie können die Startparameter eines Qt-Dienstes erhalten, indem Sie die void QtServiceBase::createApplication ( int & argc, char ** argv )

Nach Angaben der docs :

This function is only called when no service specific arguments were passed to the service constructor, and is called by exec() before it calls the executeApplication() and start() functions.

Wenn Ihr Dienst also die Startfunktion aufruft, sind die Args verfügbar, da die createApplication aufgerufen wird, bevor die start Funktion.

Hier ein Beispiel:

#include <QtCore>
#include "qtservice.h"

class Service : public QtService<QCoreApplication>
{
public:
    explicit Service(int argc, char *argv[], const QString &name) : QtService<QCoreApplication>(argc, argv, name)
    {
        setServiceDescription("Service");
        setServiceFlags(QtServiceBase::CanBeSuspended);
        setStartupType(QtServiceController::ManualStartup);
    }

protected:
    void start()
    {
        // use args;
    }

    void stop()
    {
    }

    void pause()
    {
    }

    void resume()
    {
    }

    void processCommand(int code)
    {
    }

    void createApplication(int &argc, char **argv)
    {
        for (int i = 0; i < argc; i++)
            args.append(QString(argv[i]));

        QtService::createApplication(argc, argv);
    }
private:
    QStringList args;
};

int main(int argc, char *argv[])
{
    Service s(argc, argv, "Service");
    return s.exec();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X