麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

用Delphi編寫Win2000服務程序

2019-11-18 18:24:05
字體:
供稿:網(wǎng)友

Delphi編寫Win2000服務程序

 

摘要:本文介紹用Delphi編寫Win2000服務程序,所涉及到的類是TServiceApplicatoinTServiceTServiceThread等。

 

 

關鍵字 Service/服務

 

一、Win2000服務簡介

服務程序(Service application)是一種運行于WinNT的后臺程序,每個服務程序(Service Application)中可能包含若干個服務(Service),每個服務就是其中的一個線程(該服務也可以創(chuàng)建多個子線程)。采用服務,應用程序可以獲得特殊的權限,而且不會被用戶通過Win2000的任務管理器直接結(jié)束程序,所以服務常常用來實現(xiàn)一些特殊的目標。

通過Win2000控制面板中的服務管理工具,我們可以設置/查看服務的特性:

1)服務名稱;(2)顯示名稱;(3)描述;(4)啟動類型;(5)依賴關系;

其中,服務名稱是標識給服務的。

Win2000C:/WINNT/System32/services.exe程序為例子,該Exe文件對應一個Service Application,是該服務程序的可見實體;該exe中包含多個服務(Service),例如AlerterDhcpDHCP Client),Messenger等。當我們結(jié)束一個服務的時候,該服務所在的Service Application中的其他服務并沒有被終止。

       Delphi中,Borland的工程師為我們提供了TServiceApplicationTServiceTServiceThread等類,封裝了大量細節(jié),簡化了服務程序的開發(fā)。

 

二、TServiceApplication

       Delphi中,類TServiceApplication就對應上述的ServiceApplication。利用Delphi的開發(fā)環(huán)境,我們新建一個Service Application PRoject,同時就創(chuàng)建了一個繼承自TService的類。項目文件中的Application對象就是一個TServiceApplication實例。每個TServiceApplication包含若干個TService對象,正好對應上述的服務程序和服務之間的數(shù)量關系。

通過閱讀TServiceApplicationTService類的定義,可以得知,TServiceApplicationTComponent類繼承而來,TService從類TDataModule基礎而來,Application對象負責各個TService對象的CreateDestroy。跟蹤下列代碼

Application.CreateForm(TService1, Service1);

可以發(fā)現(xiàn)創(chuàng)建的TService對象的Owner都是Application對象;在VCL FrameWorkOwner總是負責Destroy各個Component對象(VCLTComponent類采用了Composite模式),所以TServiceApplication也將Destroy各個TService對象。

下面跟蹤TServiceApplication.Run的代碼,可以發(fā)現(xiàn)TServiceApplication首先解析運行參數(shù),實現(xiàn)了服務的InstallUninstall。然后,初始化一個ServiceStartTable數(shù)組,該數(shù)組包含了各個service對象的服務名稱和運行入口;最后創(chuàng)建一個TServiceStartThread 對象,該對象是一個線程對象,從線程調(diào)用APIStartServiceCtrlDispatcher來啟動ServiceStartTable中指定的若干個服務;而ServiceApplication主線程就不斷循環(huán),處理消息,比如接收請求來停止/暫停某個服務。

 

三、TService

TService類繼承自類 TDataModule,這意味著我們可以加入大量的VCL控件,實現(xiàn)豐富的功能。此外,我們還可以處理OnStartOnPauseOnStopOnContinueOnCreateOnShutDown等事件。其中需要說明的是:OnStop表示該服務被停止;而OnShutDown表示該ServiceApplication停止運行,這意味著其他服務也被終止了;兩者含義是不一樣的。

前面講過,ServiceApplication通過調(diào)用StartServiceCtrlDispatcher來啟動各個服務。StartServiceCtrlDispatcher啟動TService的入口,該入庫就是TService.MainTService.Main首先注冊該服務,然后調(diào)用TService.DoStartTService.DoStart創(chuàng)建一個內(nèi)部TServiceThread成員對象,這是一個線程對象;考察TServiceThread.Execute可以得知,當我們處理的TService1. OnExecute,那么TService會把所有的請求委托給該TServiceThread成員對象處理,該對象以默認的方式處理所有的請求。

TService. ServiceExecuteTService的主體內(nèi)容。一個服務要正常運行,除了需要處理它要關注的目標(比如監(jiān)聽某個端口、執(zhí)行某個任務等)外,還要響應外部命令/請求:比如終止、暫停、恢復該服務。因此可以考慮創(chuàng)建一個專門的線程來完成該任務,而在ServiceExecute中處理外面命令/請求。因此代碼如下:

       while not Terminated do begin

              ServiceThread.ProcessRequests(False);

       end;

當然,也可以在OnExecute中處理某些任務,如監(jiān)聽某個端口,但是這常常會導致該Service不能及時響應Stop/Pause等請求。當OnExecute執(zhí)行完了,該服務實際上就完成了任務要結(jié)束了(terminate)。

 

參考資料:

MSDN,Delphi VCL源代碼,Delphi幫助文檔

 


上一篇:用Delphi建立通訊與數(shù)據(jù)交換服務器—Transceiver技術剖析(上)

下一篇:Delphi例程-應用程序級信息

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關注

主站蜘蛛池模板: 欧美a区| 91福利免费观看 | 91短视频在线视频 | 免费a视频在线观看 | 一区二区三区欧美在线 | 特级无码毛片免费视频尤物 | 国产成人综合在线视频 | 长泽雅美av | 精品国产一区二区三区在线观看 | 国产一级毛片a | 少妇一级淫片高潮流水电影 | 中文在线观看视频 | 久久精品免费国产 | 免费a级黄色片 | 狠狠操操| 欧美黄成人免费网站大全 | 极品xxxx欧美一区二区 | 亚洲影视在线观看 | 国产亚洲精彩视频 | 欧美一级淫片免费视频黄 | 国产精品99久久久久久久vr | 逼片视频 | 欧美18一12sex性处hd | 毛片一区二区三区四区 | 国产亚洲美女精品久久久2020 | 蜜桃网站在线 | 在线看一区二区三区 | 日本特级a一片免费观看 | 色999中文字幕 | 九九热免费视频在线观看 | 欧日韩在线| 欧美成人一区二区三区电影 | 一级黄片毛片免费看 | 欧美亚洲综合在线 | 日韩精品久久久久久久九岛 | 激情小说图 | 成年免费视频黄网站在线观看 | 在线成人精品视频 | 国产亚洲精品视频中文字幕 | 亚洲狠狠入 | 成人午夜免费网站 |