如何把你的應用程序作為服務來運行(1)
發表時間:2024-06-16 來源:明輝站整理相關軟件相關文章人氣:
[摘要]如何把你的應用程序作為服務來運行by Chris J. Duke 翻譯:Atai 原創http://vbwire.com/advanced/howto/service.asp 本文章是“How—To”特別系列的第一部分。 如果你已經精通VB,并且現在你正想發布你的...
如何把你的應用程序作為服務來運行
by Chris J. Duke
翻譯:Atai
原創http://vbwire.com/advanced/howto/service.asp
本文章是“How—To”特別系列的第一部分。
如果你已經精通VB,并且現在你正想發布你的最后杰作作為商業軟件。在最后的時間里,你們老板告訴你:你的應用程序需要在Windows NT下必須作為服務來運行。你告訴你們老板:“沒問題“。于是你回到你的工作位置,然后發現你的VB程序不能做到。于是你到Microsoft Knowledge Base尋求答案,你在網上搜索,你在新聞組里搜索,最后你在這兒就特別興奮,這兒就是VB程序如何做為服務這一系列。現在你所認為不可能的事情變得比你曾經想象的要簡單。
本文章將把注意力集中到如何在Windows 95 和Windows NT3.51和或者更高版本來把你的Visual Basic4.0 或者Visual Basic5.0程序作為服務來運行。當你的應用程序作為服務時,你的應用程序能在登陸之前啟動,這樣你的程序能夠在啟動的時候運行。這樣對于網絡程序(比如Web服務器,郵件服務器或者是其他任何那些需要一直運行的應用程序)是很有用的。
請參看下一篇文章,這篇文章是關于如何下載一個免費的ActiveX控件加載到你的Form上馬上把你的VB應用程序很簡單的設置為NT 服務。
Window95
你可能要問你自己,為什么你需要把你的應用程序在Windows95上作為一個服務來運行。你也可能問是否Window95像WindowNT能夠把你的應用程序作為服務來運行。
沒錯,Window95能夠想Windows NT那樣把應用程序作為服務來運行。為什么你將能夠做到的理由就是你將在登陸之前啟動你的應用程序。這經常會在Web服務器以及郵件服務器上使用。因為Windows 95的安全缺乏性,把你的應用程序作為服務將變的相當簡單。但是這種情況對于Windows NT來說不適合(請看下面)。
在Windows95把你的應用程序作為服務來運行是很簡單的。所有需要做的就是修改注冊表。但是對于Windows NT來說卻是一個地獄,對于Windows95,不要認為它毫無難處。本節將給你提供一個對Windows95重要的工作。
為了在Windows95中把你的應用程序作為一個服務,增加一個字符串值到你的注冊表中:
HKLM\SOFTWARE\Microsoft\
Windows\CurrentVersion\RunServices
例如。假設你的應用程序叫“MicroSpud“,創建一個字符串值,值為:MircoSpud”,并且輸入可執行文件的全路徑到注冊表的數據域中。下面是其步驟:
Step 1: 增加一個新的字符串值
Step 2: 輸入可執行文件路徑
Step 3: 全部完成,重新啟動,MicroSpud將在登陸前啟動
Windows 95托盤圖標
現在你好記得在前面提到的“Quirk”嗎?它在這里。如果你的應用程序啟動,并且有托盤的話,你將想閱讀這個對之地詳細說明。
當你的應用第一個啟動,你最有可能在Form_Load()或者Main()事件中添加你的托盤圖標。如果通過重新啟動Windows95被設為自動登陸,那么這個問題將不存在。盡管如此,當一個用戶強制登陸的話,將發生以下的事情:
Windows95 啟動
你的應用程序作為服務
你的應用程序視圖加載托盤圖標,但是失敗,因為已經沒有托盤圖標被加載
登陸對話框出現
T用戶輸入用戶名和密碼
桌面開始加載
Y你的圖標在托盤區不會出現
解決方案是重復的調用Shell_NotifyIcon()API直到它返回一個TRUE布爾值。我發現一個來實現它的解決方法是加上一個計時器。計時器初始化為啟動狀態,時間間隔為5秒。在調用計時器的事件(Timer1_Timer)時調用Shell_Notification()。一旦API返回TRUE值時,關閉計時器。
Window NT
你可能已經發現在Windows95中設置只需要一步,但是對于WindowsNT來說,和Windows 95完全不一樣。有些人可能稱之為魔鬼,這種方法能夠在WindowNT3.51或者更高版本上使用。
為什么Window NT有很大的不同呢?其中的一個理由是因為所有在NT下的服務都有服務控制臺(Service Control Manager ,SCM)來管理。但是你的應用程序信息仍然在注冊表里。
有更多的Keys允許應用程序作為NT服務。
微軟意識到這個問題不僅僅發生在VB應用程序上,而且發生在大部分應用程序上。所以微軟提出一個解決方案,并且這個解決方案表現非常出色。他們開發了一個小的應用程序。這個應用程序在Windows NT資源包里發行,他們可以在章的后面可以得到。這個應用程序叫
SRVANY.EXE,對你的應用程序來說它作為一個主機(或者服務包)。換句話說,它變成一個服務程序,這個服務程序為你處理全部的苦活(Dirty Work)和以及與SCM通信。當它啟動時,它到注冊表找出你的應用程序的所在路徑。如果找到應用程序,則啟動它。使用它唯一的缺點就是當SCM關掉SRVANY時,它將使用TerminateProcess()API來殺掉你的VB應用程序。這個是一個非常不友好的方式來關閉一個應用程序。
你的應用程序作為服務的配置是直接向前的(straight forward),但是并不和Windows95那樣簡單。在我向你展示一步步的操作之前。理解繼續做的事情非常重要。
這有兩個微軟開發的程序,這兩個程序欺騙它。首先是我提到的SRVANY.EXE,SRVANY位于WINNT\SYSTEM32目文件夾下。你的應用程序也在這個文件夾下。在你想把你的應用程序變為服務的最后,它確實是一個“精華“,這個”精華“是一個真正的服務。當你的服務啟動時,它實際上啟動的是SRVANY,SRVANY將啟動你的應用程序。
第二個程序是微軟開發的,叫INSTSRV.EXE。這個程序安裝SRVANY來作為一個服務,INSTSRV.EXE是一個通過命令行來實現其功能的。你先前使用的不在需要,除非你打算添加另外一個使用SRVANY的服務,或者是卸載先前加的服務程序。手動保持她!
SRVANY提供了一個文檔沒這個文檔描述了你使用它的步驟。這里將指導你一步一步安裝SRVANY(SRVANY是基于程序“MircoSpud“的)。
假設:
· 你作為Administator登陸,否則你將不能安裝一個服務
· 你的VB應用程序“MicroSpud”位于c:\Program Files\MicroSpud\mspud.exe
· 你已經把SRVANY。EXEINSRTSRV。EXE安裝到MicroSpud文件夾下
Step 1:使用INSTSRV。EXE安裝SRVANY。EXE作為服務
Step 2:確認你的服務在服務控制臺(控制面板)上已被加上
Step 3: 配置你的服務設置(圖為缺省)
At this point, your service has been created. However, if you were to try to start it now, it would fail. You next have to tell SRVANY where your VB application resides, so it can start it when the SCM starts SRVANY. Follow these steps to complete the installation of your new service:
在這一點上,你的服務已經被創建。但是當你試著啟動它時,將會失敗。你下一步必須告訴SRVANY你的VB應用程序在哪里,因此當SCM啟動SRVANY時SRVANY可以啟動你的應用程序。下面這些步驟降教你完成你的新服務的安裝。
Step 1: A 添加“Parameter”關鍵字
1. 啟動注冊表編輯器
2. 在HKLM\SYSTEM\
CurrentControlSet\Services\MicroSpud 找出你的服務
3. 創建一個 "Parameters" 關鍵字
Step 2: 添加 "Application" 值:
1. 打開 "Parameters" 關鍵字
2. 在"Parameters" 關鍵字里創建一個"Application" 字符串值 (REG_SZ)
3. 編輯 "Application" 以及明確應用程序的可執行文件的全路徑(包括擴展路徑)
Step 3: 增加可選值(Optional Value)
雖然不是必須,但是你可能希望為“parameter”關鍵字加上一個可選值(Optional Value)
1. AppParameter(字符串)-描述你的應用程序的任何參數
2.AppDirectory(String)-描述你的應用程序的當前目錄
祝賀你,你已經成功的將你的VB程序轉化為Windows NT 服務。在這一點上,你可能很迫切測試它。因此,關閉計算機,然后重啟。你的應用程序將在登陸之前啟動,并且在你的左面出現之前開始運行了。
這里仍然有許多的其他信息你需要知道。這些時關于SRVANY以及新的NT服務應用程序:(盡管MicroSpud使用通過一致的例子)
注冊表值沒有大小寫之分
為了卸載你的服務,使用INSTSRV。EXE,比如INSTSRV MicroSpud REMOVE
有三種方法啟動你的服務:
1. 從控制面板的服務臺
2. 使用SC.EXE ,例如: SC start MicroSpud
3. 使用NET.EXE , 例如: NET START MicroSpud
有三種方法停止服務
1. 從控制面板的服務臺
2. 使用SC.EXE,例如: SC stop MicroSpud
3. 使用NET.EXE , 例如: NET STOP MicroSpud
. 當服務停止后。它會通過Win32 TerminateProcess()API 終止應用程序.這種終止應用程序的方式是非常粗暴的。比如,它將允許應用程序彈出對話框提醒用戶保存。因此,建議在關閉服務之前關閉應用程序。
你可能多次安裝SRVANY。EXE,且使用不同的注冊表參數(比如,運行不同的目標程序)――僅僅對于每個實例使用不同的服務名字(比如,MicroSpud1,MicroSpud2等)
如果你的VB應用程序和桌面交互。務必通過點擊相應服務的“設置”按鈕配置它來做到此功能。你應該注意這些編程的考慮。為了捕獲到我們提到的消息,你學要使用一個程序比如SpyWorks。
對于WIN32圖形應用程序:當當前用戶注銷后。所有的WIN32高層的窗口將收到WM_QUERYENDSESSION 和WM_ENDSESSION消息。一些WIN32應用程序選擇在這些消息之上終止。為了你的WIN32應用程序幸免注銷,千萬不要做:代替之的是,你的Windows過程(procedure)應該調用在這些消息缺省的Windows過程
對于WIN32控制臺程序(比如字符模式):當當前登陸的用戶已經注銷。所有的控制臺程序從控制臺收到CTRL_LOGOFF_EVEN事件。
If your Console application has registered a Console event handler (via SetConsoleCtrlHandler), it must ignore CTRL_LOGOFF_EVENT in order to survive the logoff.
如果你的控制臺程序已經注冊了一個控制臺事件的話(通過SettConsoleCtrlHandler),它將必須忽略CTRL_LOGOFF_EVEN事件以至幸免被注銷。
微軟也建議你:
如果SRVANY啟動你的應用程序失敗,試著制定在注冊表里的目錄(參看“AppDirectory”注冊表關鍵字)作為當前目錄。SRVANY可能在某個帳戶下運行,這個帳戶不同于當前登陸用戶,因此環境變量應該設為不一樣,比如,系統可能不能找到應用程序所需要的DLL,從應用程序的目錄運行它可能有幫助。
因為受到WindowsNT服務的限制,應用程序能交互(有控制臺,讀取鍵盤輸入等)或者網絡訪問(但是兩者不能同時進行)。
服務的依賴性
An undocumented feature for SRVANY (which applies to any service, actually) you should know about is the "DependOnService" value. Suppose your service depends on other services. How does your service know that other services are available when your service starts? For example, let's say your service is a web server. You will want to make sure that TCP/IP is available before your service starts.
你應該知道的SRVANY的一個非正式的特性(實際上適用于所有的服務)是“DependOnServce”值。假設你的服務依賴其他服務。當你的服務啟動的時候你的服務如何知道其他的服務能夠利用呢?比如,讓我們說你的服務是一個Web服務器。你將想保證TCP/IP是可用的在你的服務啟動之前。
在服務鍵(Key)下二進制值能夠加到你的服務下,還有其他的值你如“DisplayName”,“ObjectName”等。讓我們看一下下面的屏幕截圖。它反映了對于MicroSpud服務,一個對TCP/IP和事件日志的依賴。為了找到服務的名稱來輸入到對話框,使用該服務的注冊表鍵(key)。比如,在HKLM\SYSTEM\CurrentControlSet\Services 下的 TCP/IP,它的鍵值是“Tcpip”。或者對于事件日志,你將輸入“EventLog” 。為了描述對于一個地依賴,使用00作為分隔符,在ASCII顯示中將顯示一個周期(.)
Windows 95 and Windows NT 服務
這篇文章吧注意力集中到配置你的VisualBasic4.0或者是5.0應用程序在Windows95和Windows NT3.51或者更高版本下作為服務來執行。隨著Visual Basic5.0的發布,但是VisualBasic5.0的新的兼容性對于Vb程序員來說永遠不會利用,盡管如此,你仍不能創建本地的NT服務。根據 Desaware的廣告。他們的新SpyWorks5.0產品允許你繞過SRVANY創建Visual Basic NT服務。我將回顧一下這個產品(OCX服務也順便)以及在將來更新本篇文章。
Your comments and feedback are welcome, however I'm afraid that I cannot provide technical support for SRVANY and INSTSRV. Please contact Microsoft technical support or search their knowledge base for help.
我希望你能發現這個信息是有用的。他為更進一步的VB網站(http://vb/duke.net)的讀者免費提供。全部或者部分地復制品被禁止。歡迎你的建議和反饋。盡管如此,我恐怕不能對SRVANY和INSTSRV提供技術支持。青聯系微軟的技術支持或者在他們的 knowledge base尋求幫助。
下載SRVANY
為了下載SRVANY.EXE, INSTSRV.EXE, 以及支持文檔。點擊下面連接。在這篇文章寫的時候(Q2 1997)是最新的版本。支持WindowsNT3.51和Windows NT 4.0
SRVANY.ZIP (24k)