用Delphi編寫Win2000服務程式

2021-09-30 02:46:42 字數 3352 閱讀 3808

一、

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版本中也特別新增了該功能,作為一名程式設計愛好者,你是不是也想知道如何程式設計實現該功能呢?那就隨本文一起揭開 郵件特快專遞...