qtService组件使用说明_第1页
qtService组件使用说明_第2页
qtService组件使用说明_第3页
qtService组件使用说明_第4页
qtService组件使用说明_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、qtService 组件使用说明、描述QtService组件可用于开发Windows服务和Unix守护进程。该项目提供的QtService模板类可用于实现服务应用程序,QtServiceController类可用于控制服务。在Windows系统用服务控制管理器实现。在Unix系统服务用守护进程实现。二、类说明:1、QtServiceControllerQtServiceController类提供了一组函数, 可实现从另外的应用程序来安装和运行服务并查询、 控制其执行状态。成员类型:enumQtServiceController:StartupType启动类型:常量值描述QtServiceCon

2、troller:AutoStartup0随系统启动自动启动。QtServiceController:ManualStartup1手动启动。仅用于Windows环境成员函数:QtServiceController:QtServiceController(consQString&name)创建指定名称服务的控制器。QtServiceController:?QtServiceController。virtual销毁服务控制器。boolQtServiceController:install(constQString&serviceFilePath,consQString&acc

3、ount=QString(),constQString&password=QString()static为指定文件安装服务,如安装成功返回true,否则返回falseo在Windows中使用给定的帐户和密码安装服务到服务控制管理器中。在Unix服务配置中,使用QtSoftware作为组织名称写入QSettings二SystemScope帐户和密码参数被忽略。boolQtServiceController:isInstalled()const检测服务是否安装,如已安装则返回true;否则返回false。boolQtServiceController:isRunning()const检测服

4、务运行状态,正在运行则返回true;否则返回false。boolQtServiceController:pause()暂停服务,成功暂停则返回true;否则返回false。仅当服务状态为QtServiceBase:CanBeSuspended时支持服务暂停。boolQtServiceController:resume()服务继续,服务成功恢复,则返回true;否则返回false。boolQtServiceController:sendCommand(intcode)将用户命令代码发送到服务,如请求成功发则返回true;否则返回false。该服务将调用QtServiceBase:processC

5、ommand()实现。QStringQtServiceController:serviceDescription()const返回服务的描述。QStringQtServiceController:serviceFilePath()const返回服务相关的文件路径。QStringQtServiceController:serviceName()const返回服务名称。boolQtServiceController:start(consQStringLis&arguments)启动服务,并传递参数。启动成功则返回true;否则返回false。boolQtServiceController:

6、start()启动服务,不传递参数。StartupTypeQtServiceController:startupType()const返回服务启动类型。boolQtServiceController:stop()停止服务。停止成功则返回true;否则为false。boolQtServiceController:uninstall()卸载服务,成功则返回true;否则返回falseo使用系统的服务控制管理器卸载Windows服务。在Unix服务配置中,使用QSettings二SystemScope以“QtSoftware作为组织名称来清除。2、QtServiceBaseQtServiceBase

7、类提供了一个用于实现Windows服务和Unix守护进程的API。服务通常是非交互式控制台应用程序。可以使用QtServiceController二sendCommand()和QtService:processCommand(),结合使用共享设置文件实现简单的通信。服务应用程序的main函数实例:intmain(intargc,char*argv)MyServiceservice(argc,argv);returnservice.exec();命令行参数说明:短参数长参数说明-i-install安装服务。-u-uninstall卸载服务。-e-exec作为独立应用程序执行。-t-termina

8、te停止服务。-p-pause暂停服务。短参数长参数说明-r-resume恢复暂停的服务。-ccmd-commandcmd将用户定义的命令代码cmd发送到服务应用程序。-v-version显示版本和状态信息。缺省参数时,exec()将依次调用createApplication()、executeApplication()、start()函数后启动服务等待来自服务控制器的命令。成员类型:enumQtServiceBase:MessageType消息类型:常量值描述QtServiceBase:Success0操作已成功,例如服务已启动。QtServiceBase:Error1操作失败,例如服务无法

9、启动。QtServiceBase:Warning2操作导致可能需要用户交互的警告。QtServiceBase:Information3任何类型的通常非关键的缶息。enumQtServiceBase:ServiceFlagflagsQtServiceBase:ServiceFlags服务标识:常量值描述QtServiceBase:Default0 x00服务可以停止,但不会暂停。QtServiceBase:CanBeSuspended0 x01服务可以暂停。QtServiceBase:CannotBeStopped0 x02无法停止服务。QtServiceBase:NeedsStopOnShut

10、down0 x04(仅限Windows)服务将在系统关闭之前停止。ServiceFlags类型用QFlagsServiceFlag比义,其值可以采用或“组合的形式存储。成员函数:QtServiceBase:QtServiceBase(intargcchar*argv,constQString&name)创建服务实例,命名为name。调用exec()函数后解析argc和argv参数,并被传递给应用程序的构造函数。应用程序类型由QtService子类确定。服务既未安装也未启动。服务名称不能包含任何反斜杠,长度不超过255个字符。此外,该名称在系统的服务数据库中必须是唯一的。QtServic

11、eBase:?QtServiceBase()virtual销毁服务对象。既不停止也不卸载服务。voidQtServiceBase:createApplication(in敖argc,char*argv)purevirtualprotected使用argc和argv参数创建应用程序对象。此函数仅在服务构造时未使用特定服务参数时使用,由exec()在调用executeApplication()和start()函数之前调用。可在构造需要额外参数的应用程序时重新实现createApplication()函数。intQtServiceBase:exec()执行服务。exec()函数将解析在argv中传递

12、的特定服务参数,执行所需的操作,然后退出。没有服务特定参数时,exec()将依次调用createApplication()、executeApplication()、start()函数后返回,同时启动服务等待服务控制器的命令。intQtServiceBase:executeApplication。purevirtualprotected执行以前使用createApplication()函数创建的应用程序。此函数仅在服务构造时未使用特定服务参数时使用,由exec()在调用createApplication()和start()两函数之间调用。QtServiceBase*QtServiceBase:

13、instance()static返回一个指向当前应用程序的QtServiceBase实例指针。voidQtServiceBase:logMessage(constQString&message,MessageTypetype=Successintid=0,uintcategory=0,constQByteArray&data=QByteArray()写日志消息。message:消息内容id:消息标识符category:消息类别data:可以包含任意二进制数据。在Windows系统注册表中注册的消息文件要求必须提供消息字符串的id和category,参阅MSDN。voidQtSe

14、rviceBase:pause()virtualprotected暂停服务,虚函数需重新实现(如停止轮询计时器或忽略套接字通知程序)。voidQtServiceBase:processCommand(intcode)virtualprotected处理用户命令代码,虚函数需重新实现。voidQtServiceBase:resume()virtualprotected暂停服务后恢复,虚函数需重新实现。QStringQtServiceBase:serviceDescription()const返回服务的描述。ServiceFlagsQtServiceBase:serviceFlags()const

15、返回使用ServiceFlag枚举描述的服务状态,如是否可暂停、关机前是否需停止服务等标识。QStringQtServiceBase:serviceName()const返回服务名称。voidQtServiceBase:setServiceDescription(conUString&description)设置服务描述。voidQtServiceBase:setServiceFlagserviceFlagsflags)设置服务标志的状态。voidQtServiceBase:setStartupTypeQtServiceController:StartupTypetype)设置服务启动

16、类型。voidQtServiceBase:start()purevirtualprotected启动服务,虚函数必须在QtServiceBase子类中实现。此函数是服务的核心,可在此创建需要的主要对象。此函数仅在服务构造时未使用特定服务参数时使用,由exec()在调用executeApplication()函数之后调用。QtServiceController:StartupTypeQtServiceBase:startupType()const返回服务启动类型。voidQtServiceBase:stop()virtualprotected停止服务,虚函数需重新实现。可在此处执行服务关闭前的清

17、理工作,比如删除在start()函数中创建主对象等。3、QtServiceQtService是一个为应用程序创建后台服务的模板类。服务通常是非交互式控制台应用程序,但是可以通过QtServiceController:sendCommand()和QtService二processCommand()结合使用一个共享设置文件进行些简单的通信。注意:在Unix系统上,此类依赖于QtNetwork模块工具。使用示例:classMyService:publicQtServicepublic:MyService(intargc,char*argv);MyService();protected:voidsta

18、rt();voidstop();voidpause();voidresume();voidprocessCommand(intcode);intmain(intargc,char*argv)MyServiceservice(argc,argv);returnservice.exec();使用QCoreApplication适用于没有GUI的服务,QApplication适用于有GUI的服务。需要通过重新实现QtServiceBase:start()函数来执行服务的核心工作。需要重新实现QtServiceBase:pause(),QtServiceBase:processCommand(),Qt

19、ServiceBase:resume()和QtServiceBase:stop()等函数响应控制器干预服务的请求。exec()函数解析argv中传递的服务特定参数,执行所需的操作,然后退出。当argv中没有传递服务特定参数时,exec()将依次调用createApplication()、executeApplication()、sart()函数后返回,此时服务启动等待服务控制器的命令。成员函数:QtService:QtService(intargcchar*argv,constQString&name)构造名为name的服务对象。argc和argv中的参数在exec()函数解析后传递给

20、应用程序的构造函数。在一个进程中只能有一个QtService对象。QtService:?QtService()销毁服务对象。Application*QtService:application()constprotected返回指向应用程序对象的指针。voidQtService:createApplication(in&argc,char*argv)virtualprotected创建应用程序类型的应用程序对象,将argc和argv传递给其构造函数,虚函数需重新实现。intQtService:executeApplication()virtualprotected执行以前使用create

21、Application()函数创建的应用程序,虚函数需重新实现。三、示例iAnInteractiveService 互动服务这个例子演示了如何建立QtService类的子类,如何使用start(),stop(),pause(),resume(),以及如何使用processCommand()在运行时接收控制命令。#include#include#include#include#include#includeqtservice.hclassInteractiveService:publicQtServicepublic:InteractiveService(intargc,char*argv);I

22、nteractiveService();protected:voidstart();voidstop();voidpause();voidresume();voidprocessCommand(intcode);private:QLabel*gui;InteractiveService:InteractiveService(intargc,char*argv):QtService(argc,argv,QtInteractiveService),gui(0)setServiceDescription(AQtservicewithuserinterface.);setServiceFlags(Qt

23、ServiceBase:CanBeSuspended);)InteractiveService:InteractiveService()()voidInteractiveService:start()(#ifdefined(Q_OS_WIN)if(QSysInfo:WindowsVersion&QSysInfo:WV_NT_based)&(QSysInfo:WindowsVersion=QSysInfo:WV_VISTA)logMessage(ServiceGUInotallowedonWindowsVista.Seethedocumentationforthisexample

24、formoreinformation.,QtServiceBase:Error);return;)#endifqApp-setQuitOnLastWindowClosed(false);gui=newQLabel(Service,0,Qt:WindowStaysOnTopHint|Qt:FramelessWindowHint);gui-move(QApplication:desktop()-availableGeometry().topLeft();gui-show();)voidInteractiveService:stop()deletegui;)voidInteractiveServic

25、e: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用户测试此例,需更改SystemS

26、cope设置文件中的目录QSettings:setPath(QSettings二NativeFormat,QSettings二SystemScope,QDir:tempPath();qWarning(Exampleusesdummysettingsfile:%s/QtSoftware.conf),QDir:tempPath().toLatin1().constData();#endifInteractiveServiceservice(argc,argv);returnservice.exec();2AsimpleHTTPServerHTTP 艮务器监听端口默认为8080。为每个GET请求返回

27、一个简单的HTML页面后,关闭连接。classHttpDaemon:publicQTcpServer(Q_OBJECTpublic:HttpDaemon(quint16port,QObject*parent=0):QTcpServer(parent),disabled(false)(listen(QHostAddress:Any,port);)voidincomingConnection(intsocket)(if(disabled)return;/当一个新的客户端连接时,服务器构造一个QTcpSocket与客户端的通信。/由于QTcpSocket是异步工作的,这意味着所有的通信都是在read

28、Client()和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()disabl

29、ed=false;)privateslots:voidreadClient()if(disabled)return;/当客户端向服务器发送数据时调用此槽。/服务器发现若是GET青求,就返回一个非常简单的HTMLC档QTcpSocket*socket=(QTcpSocket*)sender();if(socket-canReadLine()QStringListtokens=QString(socket-readLine().split(QRegExp(rnrn*);if(tokens0=GET)QTextStreamos(socket);os.setAutoDetectUnicode(true

30、);osHTTP/1.0200OkrnContent-Type:text/html;charset=utf-8rnrnNothingtoseeherenQDateTime:currentDateTime().toString()close();QtServiceBase:instance()-logMessage(Wrotetoclient);if(socket-state()=QTcpSocket:UnconnectedState)deletesocket;QtServiceBase:instance()-logMessage(Connectionclosed);)voiddiscardCl

31、ient()(QTcpSocket*socket=(QTcpSocket*)sender();socket-deleteLater();QtServiceBase:instance()-logMessage(Connectionclosed);)private:booldisabled;);服务器使用了QtService二logMessage()函数将消息和状态报告发送到系统事件日志。服务器还支持暂停,暂停时忽略传入请求。该HttpService通过继承QtService类实现了后台服务功能。classHttpService:publicQtService(public:HttpService

32、(intargc,char*argv):QtService(argc,argv,QtHTTPDaemon)(setServiceDescription(AdummyHTTPserviceimplementedwithQt);setServiceFlags(QtServiceBase:CanBeSuspended);)由于服务不使用GUI,构造函数使用QCoreApplication进行初始化。构造函数的前两个参数将被传递给QtService,最后一个参数“QtHTTPDaemon”是服务名称。protected:voidstart()(QCoreApplication*app=applicat

33、ion();quint16port=(app-argc()1)?QString:fromLocal8Bit(app-argv()1).toUShort():8080;daemon=newHttpDaemon(port,app);if(!daemon-isListening()logMessage(QString(Failedtobindtoport%1).arg(daemon-serverPort(),QtServiceBase:Error);app-quit();start()实现时首先检查参数是否是端口号port,是则使用,否则默认使用8080端口。然后使用new操作创建HTTP服务实例,

34、将应用程序对象作为父对象,以确保应用退出时销毁HTTP服务对象。voidpause()(daemon-pause();)voidresume()(daemon-resume();)private:HttpDaemon*daemon;);Pause()和resume()的实现将请求转发到服务器对象。#includemain.mocintmain(intargc,char*argv)(#if!defined(Q_WS_WIN)/QtServicestoresservicesettingsinSystemScope,whichnormallyrequirerootprivileges./Toallo

35、wtestingthisexampleasnon-root,wechangethedirectoryoftheSystemScopesettingsfile.QSettings:setPath(QSettings:NativeFormat,QSettings:SystemScope,QDir:tempPath();qWarning(Exampleusesdummysettingsfile:%s/QtSoftware.conf),QDir:tempPath().toLatin1().constData();#endifHttpServiceservice(argc,argv);returnser

36、vice.exec();)主入口函数创建服务对象,并使用exec()函数来执行服务。3、AnInteractiveService 服务控制器通用命令行控制器可以安装和控制使用QtService组件编写的任何服务。它演示了如何使用QtServiceController类。注意事项:在Windows安装/卸载和启动/停止服务需要安全权限,可以管理员身份运行获取。#include#include#include#includeqtservice.hintprocessArgs(intargc,char*argv)if(argc2)QStringarg1(argv1);if(argl=QLatin1S

37、tring(-i)|argl=QLatin1String(-install)if(argc2)QStringaccount;QStringpassword;QStringpath(argv2);if(argc3)account=argv3;if(argc4)password=argv4;printf(Theservice%sinstalled.n,(QtServiceController:install(path,account,password)?was:wasnot);return0;)elseQStringserviceName(argv1);QtServiceControllercon

38、troller(serviceName);QStringoption(argv2);if(option=QLatin1String(-u)|option=QLatin1String(-uninstall)printf(Theservice%s%suninstalled.n,controller.serviceName().toLatin1().constData(),(controller.uninstall()?was:wasnot);return0;elseif(option=QLatin1String(-s)|option=QLatin1String(-start)QStringList

39、args;for(inti=3;i3)QStringcodestr(argv3);intcode=codestr.toInt();printf(Thecommand%ssenttotheservice%s.n,(controller.sendCommand(code)?was:wasnot),controller.serviceName().toLatin1().constData();return0;elseif(option=QLatin1String(-v)|option=QLatin1String(-version)boolinstalled=controller.isInstalled();printf(Theservicent%snn,controller.serviceName().toLatin1().constData();printf(is%s,(installed?installed:notinstalled);printf(and%snn,(controller.isRunning()?runni

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论