介紹
通常,NT服務是控制台應用程序,它沒有消息循環。不必等到用戶 登陸電腦,NT服務便能啟動,並且在用戶登出之後,它也不會停止運行。然而, 許多現存的ActiveX控件很難,有時候根本不可能在控制台程序中使用。
另一方面,MFC和VB程序都是Windows應用程序,所以在MFC或VB程序中使用 ActiveX控件相當簡單。要是能使MFC和VB程序像NT服務一樣運行就不錯了:
• 在用戶登陸電腦之前就啟動
• 在用戶登出電腦之 後繼續運行
可以用Windows程序的形式直接寫NT服務,但是本文要提供一 個更簡單的解決方法。本文配套源代碼是一個簡單的NT服務程序,它能夠啟動和 關閉其它程序。所有你需要做的是安裝這個服務,修改.ini文件。下面是使用此 NT服務的好處。
• 它能夠啟動你指定的任意多個程序。被啟動的 程序將像 NT 服務一樣運行(例如,不用用戶登陸機器,它們便會在後台運行) 。
• 在沒有合適特權情況下,用戶不能終止由此服務啟動的程序 (除非機器關閉)。
• 你可以在 NT 服務之外測試和調試你的程 序。例如,你可以在 DevStudio 調試器中運行你的程序,單步進入源代碼中查 找錯誤等。當“調試無錯”後,你將它配置成產品,從 NT 服務啟動 它。
XYNTService
XYNTService.exe是此NT服務程序可執行文件的名字 。它是我研發的客戶-服務器開發工具的一部分。你可以免費使用和修改本文包 含的源代碼。我知道也有其它的工具提供和XYNTService幾乎相同的功能。然而 ,如你所見,XYNTService擁有更多的特性,並且更容易使用(例如,不需要編 輯注冊表)。下面顯示了如何使用此程序。
• 為了安裝(install )服務,在命令提示符下運行下面命令:XYNTService -i
• 為了 卸載(un-install)服務,在命令提示符下運行下面命令:XYNTService - u
默認情況下,在電腦重啟時,安裝的服務便會自動啟動。你也可以使用 服務圖標從控制面板啟動和關閉服務。服務啟動時,它將會一個挨一個地創建在 XYNTService.ini文件中定義的所有進程。服務關閉時,它將會終止這些進程( 以相反順序)。XYNTService.ini文件應該和可執行文件放在相同的目錄。下面 是此文件的一個例子。
[Settings]
ServiceName = XYNTService
ProcCount = 3
CheckProcess = 30
[Process0]
CommandLine = c:\MyDir\XYRoot.exe
WorkingDir = c:\MyDir
PauseStart = 1000
PauseEnd = 1000
UserInterface = Yes
Restart = Yes
[Process1]
CommandLine = c:\MyDir\XYDataManager.exe
WorkingDir = c:\MyDir
PauseStart = 1000
PauseEnd = 1000
UserInterface = Yes
Restart = Yes
[Process2]
CommandLine= java XYRoot.XYRoot XYRootJava.ini
UserInterface = No
Restart = No
ServiceName屬性指定想要為此NT服務 使用的名字,默認名字為XYNTService。如果復制可執行文件和.int文件到不同 的目錄,在.int文件中修改ServiceName屬性,即可安裝和配置一個不同的服務 。
ProcCount屬性指定想要此服務創建的進程的數量。節[Process0]、 [Process1]等定義了相關進程的屬性。如你所見,此例中要創建3個進程, XYRoot.exe,XYDataManager和java是程序的名稱,你可以為每個進程在 CommandLine屬性指定參數。必須在CommandLine屬性為對應進程指定可執行文件 的完整路徑,除非可執行文件在系統路徑。
CheckProcess屬性指定是否 檢查XYNTService啟動的進程,也指定了檢查的頻率。如果此屬性的值為0,便不 進行檢查。如果屬性的值為30,則每經30分鐘XYNTService將查詢操作系統以查 看它啟動的進程是否還在運行,如果進程的Restart屬性值(後門解釋)定義為 Yes,則將終止的重新啟動。此屬性的默認值(如果你沒有指定它)是60。
WorkingDir屬性是當前進程的工作目錄。如果你沒有指定此屬性,當前 進程的工作目錄將會是X:\winnt\system32。PauseStart屬性是服務在啟動當前 進程後將等待的時間(以毫秒為單位)。在下一個進程需要依靠前一個進程的情 況下此選項非常有用。例如,第二個進程不得不連接到第一個進程以便在第一個 進程完成初始化後它再運行。如果你沒有指定PauseStart屬性,默認值將是100 毫秒。
當XYNTService關閉時,它將首先向它創建的進程投遞WM_QUIT消 息,然後調用Win32函數TerminateProcess。PauseEnd屬性是服務在調用 TerminateProcess之前等待的時間(以毫秒為單位)。此屬性可以用來給進程清 除和關閉的機會。如果你沒有指定PauseEnd屬性,默認值將是100毫秒。
UserInterface屬性控制一個登陸用戶是否能夠看到XYNTService創建的 進程。然而,僅當XYNTService運行在本地系統帳戶下時才起作用,默認就是這 樣的。在這種情況下,XYNTService創建的進程將不能訪問特定用戶的設置。你 可以配置XYNTService運行在一個用戶帳戶下,在控制面板中很容易做到這一點 (雙擊服務圖標,然後在安裝的服務列表中雙擊XYNTService彈出配置對話框) 。
Restart屬性用來決定你是否想要XYNTService重新啟動終止的進程。 如果此屬性是No(這是默認值),那麼對應進程將不會被重啟。如果是Yes,那 麼終止的進程將會被XYNTService重新啟動。啟動終止進程的頻率由上面的 CheckProcess屬性指定。
你可以從命令行反彈(停止和重啟).int文件 中定義的任何進程。例如,如下命令:
XYNTService -b 2
將停止和重新啟動.ini中[Process2]節定義的進程。
XYNTService也可以用來從命令行啟動和停止其它服務。下面是啟動 (run)和停止(kill)其它服務的命令。
XYNTService -r NameOfServiceToRun
XYNTService -k NameOfServiceToKill
特別的,你可以在命令行使用上面的命令 啟動和停止XYNTService自身。請注意,你不能不帶參數啟動XYNTService。
運行XYNTService時出現的所有錯誤都將被寫入日志文件,此文件與可執 行文件在相同目錄下。日志文件中的出錯代碼是GetLastError API返回的十進制 數字,你可以在MSDN中查看詳細信息。
本文配套源碼