資源描述:
《用delphi編寫windows服務(wù)程序》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、用Delphi編寫Windows服務(wù)程序(1)一、Windows服務(wù)簡(jiǎn)介 服務(wù)程序(ServiceApplication)是一種運(yùn)行于WinNT的后臺(tái)程序,每個(gè)服務(wù)程序(ServiceApplication)中可能包含若干個(gè)服務(wù)(Service),每個(gè)服務(wù)就是其中的一個(gè)線程(該服務(wù)也可以創(chuàng)建多個(gè)子線程)。采用服務(wù),應(yīng)用程序可以獲得特殊的權(quán)限,而且不會(huì)被用戶通過Win2000的任務(wù)管理器直接結(jié)束程序,所以服務(wù)常常用來實(shí)現(xiàn)一些特殊的目標(biāo)。 通過Win2000控制面板中的服務(wù)管理工具,我們可以設(shè)置/查看服務(wù)的特性: ?。?)服務(wù)名稱;(2)顯示名稱;(3)描述;(4)啟動(dòng)類型;(5
2、)依賴關(guān)系; 其中,服務(wù)名稱是標(biāo)識(shí)給服務(wù)的?! ∫訵in2000的C:WINNTSystem32services.exe程序?yàn)槔?,該Exe文件對(duì)應(yīng)一個(gè)ServiceApplication,是該服務(wù)程序的可見實(shí)體;該exe中包含多個(gè)服務(wù)(Service),例如Alerter,Dhcp(DHCPClient),Messenger等。當(dāng)我們結(jié)束一個(gè)服務(wù)的時(shí)候,該服務(wù)所在的ServiceApplication中的其他服務(wù)并沒有被終止?! ≡贒elphi中,Borland的工程師為我們提供了TServiceApplication,TService,TServiceThread等類
3、,封裝了大量細(xì)節(jié),簡(jiǎn)化了服務(wù)程序的開發(fā)。二、TServiceApplication 在Delphi中,類TServiceApplication就對(duì)應(yīng)上述的ServiceApplication。利用Delphi的開發(fā)環(huán)境,我們新建一個(gè)ServiceApplicationProject,同時(shí)就創(chuàng)建了一個(gè)繼承自TService的類。項(xiàng)目文件中的Application對(duì)象就是一個(gè)TServiceApplication實(shí)例。每個(gè)TServiceApplication包含若干個(gè)TService對(duì)象,正好對(duì)應(yīng)上述的服務(wù)程序和服務(wù)之間的數(shù)量關(guān)系?! ⊥ㄟ^閱讀TServiceApplicatio
4、n和TService類的定義,可以得知,TServiceApplication從TComponent類繼承而來,TService從類TDataModule基礎(chǔ)而來,Application對(duì)象負(fù)責(zé)各個(gè)TService對(duì)象的Create和Destroy。跟蹤下列代碼 Application.CreateForm(TService1,Service1); 可以發(fā)現(xiàn)創(chuàng)建的TService對(duì)象的Owner都是Application對(duì)象;在VCLFrameWork中Owner總是負(fù)責(zé)Destroy各個(gè)Component對(duì)象(VCL的TComponent類采用了Composite模式),所
5、以TServiceApplication也將Destroy各個(gè)TService對(duì)象?! ∠旅娓橳ServiceApplication.Run的代碼,可以發(fā)現(xiàn)TServiceApplication首先解析運(yùn)行參數(shù),實(shí)現(xiàn)了服務(wù)的Install和Uninstall。然后,初始化一個(gè)ServiceStartTable數(shù)組,該數(shù)組包含了各個(gè)service對(duì)象的服務(wù)名稱和運(yùn)行入口;最后創(chuàng)建一個(gè)TServiceStartThread對(duì)象,該對(duì)象是一個(gè)線程對(duì)象,從線程調(diào)用API:StartServiceCtrlDispatcher來啟動(dòng)ServiceStartTable中指定的若干個(gè)服務(wù);而S
6、erviceApplication主線程就不斷循環(huán),處理消息,比如接收請(qǐng)求來停止/暫停某個(gè)服務(wù)。三、TService TService類繼承自類TDataModule,這意味著我們可以加入大量的VCL控件,實(shí)現(xiàn)豐富的功能。此外,我們還可以處理OnStart,OnPause,OnStop,OnContinue,OnCreate,OnShutDown等事件。其中需要說明的是:OnStop表示該服務(wù)被停止;而OnShutDown表示該ServiceApplication停止運(yùn)行,這意味著其他服務(wù)也被終止了;兩者含義是不一樣的。? 前面講過,ServiceApplication通過調(diào)
7、用StartServiceCtrlDispatcher來啟動(dòng)各個(gè)服務(wù)。StartServiceCtrlDispatcher啟動(dòng)TService的入口,該入庫就是TService.Main。TService.Main首先注冊(cè)該服務(wù),然后調(diào)用TService.DoStart。TService.DoStart創(chuàng)建一個(gè)內(nèi)部TServiceThread成員對(duì)象,這是一個(gè)線程對(duì)象;考察TServiceThread.Execute可以得知,當(dāng)我們處理的TService1.OnExecute,那