天天看點

對Delphi 7/Delphi 2007的Windows服務類庫的一個小改進

Windows 2000以上的Windows版本所支援的Windows服務的功能有所改進,其變化展現在AdvApi32.dll中。其新增的函數包括:

ChangeServiceConfig2

QueryServiceConfig2

EnumServicesStatusEx

QueryServiceStatusEx

RegisterServiceCtrlHandlerEx

NotifyServiceStatusChange

ControlServiceEx

這些函數在最新版本的MSDN文檔中有詳細記載。這些改進對我們編寫Windows服務的主要影響有:

首先,最大的好處在于,以往在ServiceMain中調用RegisterServiceCtrlHandler的時候,所注冊的ServiceController例程隻有一個參數,就是控制碼。在很多情況下,這是不夠的。換句話說,如果需要注冊一段共享的ServiceController代碼,是無法做到的。例如Delphi的Windows服務架構在處理這個問題的時候就不太友善,一個Windows服務應用程式就隻有有一個ServiceController例程,并且該例程隻能通路全局上下文。而新的RegisterServiceCtrlHandlerEx所注冊的ServiceController例程一共有四個參數:控制碼、事件類型、事件資料和外部上下文。特别是這個上下文,非常友善在ServiceController中通路單獨的私有的類執行個體代碼。我沒有Delphi2007的WinSvc的源碼,但我根據編譯時的提示,判定估計該類庫沒有更新。

其次,在調用ControlService的時候,隻能控制服務的狀态,而ControlServiceEx還可以加注進行這些控制的原因。

再次, QueryServiceStatusEx可以查詢相關程序的資訊。

最後,在登記Windows服務後,可以進一步修改配置,例如,Delphi的Windows服務架構無法設定Windows服務的描述。JEDI類庫雖然也可以設定描述,但是卻是通過修改注冊器來實作的。而ChangeServiceConfig2可以很簡單地解決這個問題。此外,還可以設定在Windows啟動或停止失敗後,可以指定運作某個活動(例如,可以重新開機或者執行某個指令)。

本文轉自 obarton 51CTO部落格,原文連結:http://blog.51cto.com/kanas/285917

繼續閱讀