qtService组件使用说明.docx
《qtService组件使用说明.docx》由会员分享,可在线阅读,更多相关《qtService组件使用说明.docx(23页珍藏版)》请在冰点文库上搜索。
qtService组件使用说明
qtService组件使用说明
一、描述
QtService组件可用于开发Windows服务和Unix守护进程。
该项目提供的QtService模板类可用于实现服务应用程序,QtServiceController类可用于控制服务。
在Windows系统用服务控制管理器实现。
在Unix系统服务用守护进程实现。
二、类说明:
1、QtServiceController
QtServiceController类提供了一组函数,可实现从另外的应用程序来安装和运行服务并查询、控制其执行状态。
成员类型:
enumQtServiceController:
:
StartupType
启动类型:
常量
值
描述
QtServiceController:
:
AutoStartup
0
随系统启动自动启动。
QtServiceController:
:
ManualStartup
1
手动启动。
仅用于Windows环境
成员函数:
QtServiceController:
:
QtServiceController(const QString&name)
创建指定名称服务的控制器。
QtServiceController:
:
〜QtServiceController() [virtual]
销毁服务控制器。
boolQtServiceController:
:
install(const QString&serviceFilePath,constQString&account =QString(),const QString&password =QString()) [static]
为指定文件安装服务,如安装成功返回true,否则返回false。
在Windows中使用给定的帐户和密码安装服务到服务控制管理器中。
在Unix服务配置中,使用“QtSoftware”作为组织名称写入QSettings:
:
SystemScope。
帐户和密码参数被忽略。
boolQtServiceController:
:
isInstalled()const
检测服务是否安装,如已安装则返回true; 否则返回false。
boolQtServiceController:
:
isRunning()const
检测服务运行状态,正在运行则返回true; 否则返回false。
boolQtServiceController:
:
pause()
暂停服务,成功暂停则返回true; 否则返回false。
仅当服务状态为QtServiceBase:
:
CanBeSuspended时支持服务暂停。
boolQtServiceController:
:
resume()
服务继续,服务成功恢复,则返回true; 否则返回false。
boolQtServiceController:
:
sendCommand(int code)
将用户命令代码发送到服务,如请求成功发则返回true; 否则返回false。
该服务将调用QtServiceBase:
:
processCommand()实现。
QString QtServiceController:
:
serviceDescription()const
返回服务的描述。
QString QtServiceController:
:
serviceFilePath()const
返回服务相关的文件路径。
QString QtServiceController:
:
serviceName()const
返回服务名称。
boolQtServiceController:
:
start(const QStringList&arguments)
启动服务,并传递参数。
启动成功则返回true; 否则返回false。
boolQtServiceController:
:
start()
启动服务,不传递参数。
StartupType QtServiceController:
:
startupType()const
返回服务启动类型。
boolQtServiceController:
:
stop()
停止服务。
停止成功则返回true; 否则为false。
boolQtServiceController:
:
uninstall()
卸载服务,成功则返回true; 否则返回false。
使用系统的服务控制管理器卸载Windows服务。
在Unix服务配置中,使用QSettings:
:
SystemScope以“QtSoftware”作为组织名称来清除。
2、QtServiceBase
QtServiceBase类提供了一个用于实现Windows服务和Unix守护进程的API。
服务通常是非交互式控制台应用程序。
可以使用QtServiceController:
:
sendCommand()和QtService:
:
processCommand(),结合使用共享设置文件实现简单的通信。
服务应用程序的main函数实例:
intmain(intargc,char**argv)
{
MyServiceservice(argc,argv);
returnservice.exec();
}
命令行参数说明:
短参数
长参数
说明
-i
-install
安装服务。
-u
-uninstall
卸载服务。
-e
-exec
作为独立应用程序执行。
-t
-terminate
停止服务。
-p
-pause
暂停服务。
-r
-resume
恢复暂停的服务。
-ccmd
--commandcmd
将用户定义的命令代码cmd发送到服务应用程序。
-v
-version
显示版本和状态信息。
缺省参数时,exec()将依次调用createApplication()、executeApplication()、start()函数后启动服务等待来自服务控制器的命令。
成员类型:
enumQtServiceBase:
:
MessageType
消息类型:
常量
值
描述
QtServiceBase:
:
Success
0
操作已成功,例如服务已启动。
QtServiceBase:
:
Error
1
操作失败,例如服务无法启动。
QtServiceBase:
:
Warning
2
操作导致可能需要用户交互的警告。
QtServiceBase:
:
Information
3
任何类型的通常非关键的信息。
enumQtServiceBase:
:
ServiceFlag
flagsQtServiceBase:
:
ServiceFlags
服务标识:
常量
值
描述
QtServiceBase:
:
Default
0x00
服务可以停止,但不会暂停。
QtServiceBase:
:
CanBeSuspended
0x01
服务可以暂停。
QtServiceBase:
:
CannotBeStopped
0x02
无法停止服务。
QtServiceBase:
:
NeedsStopOnShutdown
0x04
(仅限Windows)服务将在系统关闭之前停止。
ServiceFlags类型用QFlags 定义,其值可以采用“或”组合的形式存储。
成员函数:
QtServiceBase:
:
QtServiceBase(int argc,char** argv,const QString&name)
创建服务实例,命名为name。
调用exec()函数后解析argc和argv参数,并被传递给应用程序的构造函数。
应用程序类型由QtService子类确定。
服务既未安装也未启动。
服务名称不能包含任何反斜杠,长度不超过255个字符。
此外,该名称在系统的服务数据库中必须是唯一的。
QtServiceBase:
:
〜QtServiceBase() [virtual]
销毁服务对象。
既不停止也不卸载服务。
voidQtServiceBase:
:
createApplication(int&argc,char** argv) [purevirtualprotected]
使用argc和argv参数创建应用程序对象。
此函数仅在服务构造时未使用特定服务参数时使用,由exec()在调用executeApplication()和start()函数之前调用。
可在构造需要额外参数的应用程序时重新实现createApplication()函数。
intQtServiceBase:
:
exec()
执行服务。
exec()函数将解析在argv中传递的特定服务参数,执行所需的操作,然后退出。
没有服务特定参数时,exec()将依次调用createApplication()、executeApplication()、start()函数后返回,同时启动服务等待服务控制器的命令。
intQtServiceBase:
:
executeApplication() [purevirtualprotected]
执行以前使用createApplication()函数创建的应用程序。
此函数仅在服务构造时未使用特定服务参数时使用,由exec()在调用createApplication()和start()两函数之间调用。
QtServiceBase*QtServiceBase:
:
instance() [static]
返回一个指向当前应用程序的QtServiceBase实例指针。
voidQtServiceBase:
:
logMessage(const QString&message,MessageType type=Success,int id =0,uint category =0,const QByteArray&data =QByteArray())
写日志消息。
message:
消息内容
id:
消息标识符
category:
消息类别
data:
可以包含任意二进制数据。
在Windows系统注册表中注册的消息文件要求必须提供消息字符串的id和category,参阅MSDN。
voidQtServiceBase:
:
pause() [virtualprotected]
暂停服务,虚函数需重新实现(如停止轮询计时器或忽略套接字通知程序)。
voidQtServiceBase:
:
processCommand(int code) [virtualprotected]
处理用户命令代码,虚函数需重新实现。
voidQtServiceBase:
:
resume() [virtualprotected]
暂停服务后恢复,虚函数需重新实现。
QString QtServiceBase:
:
serviceDescription()const
返回服务的描述。
ServiceFlags QtServiceBase:
:
serviceFlags()const
返回使用ServiceFlag枚举描述的服务状态,如是否可暂停、关机前是否需停止服务等标识。
QString QtServiceBase:
:
serviceName()const
返回服务名称。
voidQtServiceBase:
:
setServiceDescription(const QString&description)
设置服务描述。
voidQtServiceBase:
:
setServiceFlags(ServiceFlags flags)
设置服务标志的状态。
voidQtServiceBase:
:
setStartupType(QtServiceController:
:
StartupType type)
设置服务启动类型。
voidQtServiceBase:
:
start() [purevirtualprotected]
启动服务,虚函数必须在QtServiceBase子类中实现。
此函数是服务的核心,可在此创建需要的主要对象。
此函数仅在服务构造时未使用特定服务参数时使用,由exec()在调用executeApplication()函数之后调用。
QtServiceController:
:
StartupType QtServiceBase:
:
startupType()const
返回服务启动类型。
voidQtServiceBase:
:
stop() [virtualprotected]
停止服务,虚函数需重新实现。
可在此处执行服务关闭前的清理工作,比如删除在start()函数中创建主对象等。
3、QtService
QtService是一个为应用程序创建后台服务的模板类。
服务通常是非交互式控制台应用程序,但是可以通过QtServiceController:
:
sendCommand()和QtService:
:
processCommand()结合使用一个共享设置文件进行些简单的通信。
注意:
在Unix系统上,此类依赖于QtNetwork模块工具。
使用示例:
classMyService:
publicQtService
{
public:
MyService(intargc,char**argv);
~MyService();
protected:
voidstart();
voidstop();
voidpause();
voidresume();
voidprocessCommand(intcode);
};
intmain(intargc,char**argv)
{
MyServiceservice(argc,argv);
returnservice.exec();
}
使用QCoreApplication适用于没有GUI的服务,QApplication适用于有GUI的服务。
需要通过重新实现QtServiceBase:
:
start()函数来执行服务的核心工作。
需要重新实现QtServiceBase:
:
pause(),QtServiceBase:
:
processCommand(),QtServiceBase:
:
resume()和QtServiceBase:
:
stop()等函数响应控制器干预服务的请求。
exec()函数解析argv中传递的服务特定参数,执行所需的操作,然后退出。
当argv中没有传递服务特定参数时,exec()将依次调用createApplication()、executeApplication()、start()函数后返回,此时服务启动等待服务控制器的命令。
成员函数:
QtService:
:
QtService(int argc,char** argv,const QString&name)
构造名为name的服务对象。
argc和argv中的参数在exec()函数解析后传递给应用程序的构造函数。
在一个进程中只能有一个QtService对象。
QtService:
:
〜QtService()
销毁服务对象。
Application*QtService:
:
application()const[protected]
返回指向应用程序对象的指针。
voidQtService:
:
createApplication(int&argc,char** argv) [virtualprotected]
创建应用程序类型的应用程序对象,将argc和argv传递给其构造函数,虚函数需重新实现。
intQtService:
:
executeApplication() [virtualprotected]
执行以前使用createApplication()函数创建的应用程序,虚函数需重新实现。
三、示例
1、AnInteractiveService互动服务
这个例子演示了如何建立QtService类的子类,如何使用start(),stop(),pause(),resume(),以及如何使用processCommand()在运行时接收控制命令。
#include
#include
#include
#include
#include
#include"qtservice.h"
classInteractiveService:
publicQtService
{
public:
InteractiveService(intargc,char**argv);
~InteractiveService();
protected:
voidstart();
voidstop();
voidpause();
voidresume();
voidprocessCommand(intcode);
private:
QLabel*gui;
};
InteractiveService:
:
InteractiveService(intargc,char**argv)
:
QtService(argc,argv,"QtInteractiveService"),gui(0)
{
setServiceDescription("AQtservicewithuserinterface.");
setServiceFlags(QtServiceBase:
:
CanBeSuspended);
}
InteractiveService:
:
~InteractiveService()
{
}
voidInteractiveService:
:
start()
{
#ifdefined(Q_OS_WIN)
if((QSysInfo:
:
WindowsVersion&QSysInfo:
:
WV_NT_based)&&
(QSysInfo:
:
WindowsVersion>=QSysInfo:
:
WV_VISTA)){
logMessage("ServiceGUInotallowedonWindowsVista.Seethedocumentationforthisexampleformoreinformation.",QtServiceBase:
:
Error);
return;
}
#endif
qApp->setQuitOnLastWindowClosed(false);
gui=newQLabel("Service",0,Qt:
:
WindowStaysOnTopHint|Qt:
:
FramelessWindowHint);
gui->move(QApplication:
:
desktop()->availableGeometry().topLeft());
gui->show();
}
voidInteractiveService:
:
stop()
{
deletegui;
}
voidInteractiveService:
:
pause()
{
if(gui)
gui->hide();
}
voidInteractiveService:
:
resume()
{
if(gui)
gui->show();
}
voidInteractiveService:
:
processCommand(intcode)
{
gui->setText("Commandcode"+QString:
:
number(code));
gui->adjustSize();
}
intmain(intargc,char**argv)
{
#if!
defined(Q_WS_WIN)
//QtService在SystemScope中存储服务设置,通常需要root权限。
//要想用非root用户测试此例,需更改SystemScope设置文件中的目录
QSettings:
:
setPath(QSettings:
:
NativeFormat,QSettings:
:
SystemScope,QDir:
:
tempPath());
qWarning("(Exampleusesdummysettingsfile:
%s/QtSoftware.conf)",QDir:
:
tempPath().toLatin1().constData());
#endif
InteractiveServiceservice(argc,argv);
returnservice.exec();
}
2、AsimpleHTTPServerHTTP服务器
监听端口默认为8080。
为每个GET请求返回一个简单的HTML页面后,关闭连接。
classHttpDaemon:
publicQTcpServer
{
Q_OBJECT
public:
HttpDaemon(quint16port,QObject*parent=0):
QTcpServer(parent),disabled(false)
{
listen(QHostAddress:
:
Any,port);
}
voidincomingConnection(intsocket)
{
if(disabled)
return;
//当一个新的客户端连接时,服务器构造一个QTcpSocket与客户端的通信。
//由于QTcpSocket是异步工作的,这意味着所有的通信都是在readClient()和discardClient()两个槽中完成。
QTcpSocket*s=newQTcpSocket(this);
connect(s,SIGNAL(readyRead()),this,SLOT(readClient()));
connect(s,SIGNAL(disconnected()),this,SLOT(discardClient()));
s->setSocketDescriptor(socket);
QtServiceBase:
:
instance()->logMessage("NewConnection");
}
voidpause()
{
disabled=true;
}
voidresume()
{
disabled=false;
}
privateslots:
voidreadClient()
{
if(