我想开发一个远程一些自定义的QObject(实际上这个QObject访问某些数据库,并提出一些统计数据)的服务。为此我使用QtService和QtRemoteObject,当我在一个简单的QCoreApplication中托管远程对象时,一切都很好,我可以连接到主机并运行插槽或获取信号,但是当我在QtService上托管远程对象时应用程序,我无法连接到主机,起初我想过防火墙,所以我为应用程序添加了一个入站出站规则,但仍然不起作用。 代码有点大(serval文件),如果你需要它的任何部分,我会提供它。QtService和QtRemoteObject如何使然后工作togather
服务类:
#include <QtService>
#include <QCoreApplication>
#include <QRemoteObjectHost>
#include "affairstatero.h"
class AffairStateService : public QtService<QCoreApplication>
{
public:
explicit AffairStateService(int argc, char** argv, const QString& name = "affair_state");
// QtServiceBase interface
protected:
void start() override;
void stop() override;
void pause() override;
void resume() override;
private:
AffairStateRemoteObject* _affairStateRO;
QRemoteObjectHost* _remotingHost;
};
CPP:
#include "affairstateservice.h"
#include <QDebug>
#include <QSqliteSettings>
AffairStateService::AffairStateService(int argc, char **argv, const QString &name):
QtService(argc,argv,name)
{
this->setServiceDescription("report affair states.");
this->setServiceFlags(QtService::CanBeSuspended);
qDebug() << "service starting ...";
}
void AffairStateService::start()
{
_affairStateRO = new AffairStateRemoteObject();
_remotingHost = new QRemoteObjectHost();
qInfo() << "Starting the service";
QSqliteSettings settings;
qInfo() << "Settings filename " << settings.fileName() << settings.organizationName() << settings.applicationName();
_affairStateRO->startTimer();
_remotingHost->setHostUrl(QUrl(settings.value("endpoint").toString()));
_remotingHost->enableRemoting(_affairStateRO, "AffairStateRO");
qInfo() << "Remoting on " << _remotingHost->hostUrl().toString();
qInfo() << "Done";
}
void AffairStateService::stop()
{
_affairStateRO->stopTimer();
_remotingHost->disableRemoting(_affairStateRO);
}
void AffairStateService::pause()
{
_remotingHost->disableRemoting(_affairStateRO);
}
void AffairStateService::resume()
{
_remotingHost->enableRemoting(_affairStateRO);
}
信息:10的Windows/X64 - Qt的5.9.1 MCVS2017