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