一、
win2000
服務簡介
服務程式(
)是一種執行於
winnt
的後台程式,每個服務程式(
)中可能包含若干個服務(
service
),每個服務就是其中的乙個執行緒(該服務也可以建立多個子執行緒)。採用服務,應用程式可以獲得特殊的許可權,而且不會被使用者通過
win2000
的任務管理器直接結束程式,所以服務常常用來實現一些特殊的目標。
通過win2000
控制面板中的服務管理工具,我們可以設定
/檢視服務的特性:(1
)服務名稱;(
2)顯示名稱;(
3)描述;(
4)啟動型別;(
5)依賴關係;
其中,服務名稱是標識給服務的。
以win2000
的c:/winnt/system32/services.exe
程式為例子,該
exe檔案對應乙個
,是該服務程式的可見實體;該
exe中包含多個服務(
service
),例如
alerter
,dhcp
(dhcp client
),messenger
等。當我們結束乙個服務的時候,該服務所在的
中的其他服務並沒有被終止。
??????
在delphi
中,borland
的工程師為我們提供了
,tservice
,tservicethread
等類,封裝了大量細節,簡化了服務程式的開發。
?
二、
??????
在delphi
中,類就對應上述的
。利用delphi
的開發環境,我們新建乙個
,同時就建立了乙個繼承自
tservice
的類。專案檔案中的
物件就是乙個
例項。每個
包含若干個
tservice
物件,正好對應上述的服務程式和服務之間的數量關係。
通過閱讀
和tservice
類的定義,可以得知,
從tcomponent
類繼承而來,
tservice
從類tdatamodule
基礎而來,
物件負責各個
tservice
物件的create
和destroy
。跟蹤下列**
可以發現建立的
tservice
物件的owner
都是物件;在
vcl framework
中owner
總是負責
destroy
各個component
物件(vcl
的tcomponent
類採用了
composite
模式),所以
也將destroy
各個tservice
物件。下面跟蹤
的**,可以發現
首先解析執行引數,實現了服務的
install
和uninstall
。然後,初始化乙個
servicestarttable
陣列,該陣列包含了各個
service
物件的服務名稱和執行入口;最後建立乙個
tservicestartthread
物件,該物件是乙個執行緒物件,從執行緒呼叫
api:
startservicectrldispatcher
來啟動servicestarttable
中指定的若干個服務;而
主線程就不斷迴圈,處理訊息,比如接收請求來停止
/暫停某個服務。
?
三、
tservice
tservice
類繼承自類
tdatamodule
,這意味著我們可以加入大量的
vcl控制項,實現豐富的功能。此外,我們還可以處理
onstart
,onpause
,onstop
,oncontinue
,oncreate
,onshutdown
等事件。其中需要說明的是:
onstop
表示該服務被停止;而
onshutdown
表示該停止執行,這意味著其他服務也被終止了;兩者含義是不一樣的。
前面講過,
通過呼叫
startservicectrldispatcher
來啟動各個服務。
startservicectrldispatcher
啟動tservice
的入口,該入庫就是
tservice.main
。tservice.main
首先註冊該服務,然後呼叫
tservice.dostart
。tservice.dostart
建立乙個內部
tservicethread
成員物件,這是乙個執行緒物件;考察
tservicethread.execute
可以得知,當我們處理的
tservice1. onexecute
,那麼tservice
會把所有的請求委託給該
tservicethread
成員物件處理,該物件以預設的方式處理所有的請求。
tservice. serviceexecute
是tservice
的主體內容。乙個服務要正常執行,除了需要處理它要關注的目標(比如監聽某個埠、執行某個任務等)外,還要響應外部命令
/請求:比如終止、暫停、恢復該服務。因此可以考慮建立乙個專門的執行緒來完成該任務,而在
serviceexecute
中處理外面命令
/請求。因此**如下:
?????? while not terminated do begin
??????
?????? servicethread.processrequests(false);
?????? end;
當然,也可以在
onexecute
中處理某些任務,如監聽某個埠,但是這常常會導致該
service
不能及時響應
stop/pause
等請求。當
onexecute
執行完了,該服務實際上就完成了任務要結束了(
terminate)。?
VC 實現Win200直接讀寫磁碟扇區
vc 實現win200直接讀寫磁碟扇區 出處 www.csdn.net 引言 由於windows 作業系統在很大程度上採取了訪問安全保護機制 例如,在windows作業系統下不能直接訪問物理記憶體 不能使用各種dos bios中斷等等 使得廣 大程式設計人員在長時間的開發過程中不知不覺地逐漸養成了這...
用Delphi編寫安裝程式 1
用delphi編寫安裝程式 1 當你完成乙個應用軟體的開發後,那麼你還需要為該軟體做乙個規範化的安裝程式,這是程式設計的最後一步,同時也是很重要的一步,因為執行安裝程式往往是使用者做的第一步操作。很多報刊文章介紹了許多如何利用installshield等工具軟體來製作安裝程式的方法,這種辦法可以很快...
用Delphi編寫郵件特快專遞程式
郵件特快專遞 這個詞現在已經是被廣大的網民所熟知了,它就好比是網路上的ems,能夠直接把郵件送到對方的郵箱中,郵件傳送完畢後,對方就可以立刻收到。foxmail在其最新的4.0版本中也特別新增了該功能,作為一名程式設計愛好者,你是不是也想知道如何程式設計實現該功能呢?那就隨本文一起揭開 郵件特快專遞...