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