QtService不从Service Manager窗口传递启动参数

时间:2011-09-22 10:42:19

标签: qt

如何获取从Windows服务管理器对话框传递的Start参数。我希望得到它们作为命令行args传递给main函数。

enter image description here

如果我在创建服务时将参数传递给binPath,那么我会将参数传递给main函数。

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

但是这样我们每次都需要卸载并安装服务来更改任何参数。 有没有办法在Qt中获取启动参数?

如果我使用.NET创建服务,我可以使用以下函数来获取这些Start参数。

 System::Environment::GetCommandLineArgs();

1 个答案:

答案 0 :(得分:1)

我知道这个问题已经过时了,但问题仍未解决,问题一直持续到现在,我认为这是合适的答案。

您可以通过重新实现void QtServiceBase::createApplication ( int & argc, char ** argv )

来获取Qt服务的启动参数

根据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.

因此,当您的服务调用start函数时,args将可用,因为在createApplication函数之前调用了start

这是一个例子:

#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();
}