明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

如何把你的應(yīng)用程序作為服務(wù)來運行(1)

[摘要]如何把你的應(yīng)用程序作為服務(wù)來運行by Chris J. Duke 翻譯:Atai 原創(chuàng)http://vbwire.com/advanced/howto/service.asp 本文章是“How—To”特別系列的第一部分。 如果你已經(jīng)精通VB,并且現(xiàn)在你正想發(fā)布你的...
如何把你的應(yīng)用程序作為服務(wù)來運行

by Chris J. Duke

 翻譯:Atai

原創(chuàng)http://vbwire.com/advanced/howto/service.asp





本文章是“How—To”特別系列的第一部分。



如果你已經(jīng)精通VB,并且現(xiàn)在你正想發(fā)布你的最后杰作作為商業(yè)軟件。在最后的時間里,你們老板告訴你:你的應(yīng)用程序需要在Windows NT下必須作為服務(wù)來運行。你告訴你們老板:“沒問題“。于是你回到你的工作位置,然后發(fā)現(xiàn)你的VB程序不能做到。于是你到Microsoft Knowledge Base尋求答案,你在網(wǎng)上搜索,你在新聞組里搜索,最后你在這兒就特別興奮,這兒就是VB程序如何做為服務(wù)這一系列,F(xiàn)在你所認(rèn)為不可能的事情變得比你曾經(jīng)想象的要簡單。



本文章將把注意力集中到如何在Windows 95 和Windows NT3.51和或者更高版本來把你的Visual Basic4.0 或者Visual Basic5.0程序作為服務(wù)來運行。當(dāng)你的應(yīng)用程序作為服務(wù)時,你的應(yīng)用程序能在登陸之前啟動,這樣你的程序能夠在啟動的時候運行。這樣對于網(wǎng)絡(luò)程序(比如Web服務(wù)器,郵件服務(wù)器或者是其他任何那些需要一直運行的應(yīng)用程序)是很有用的。

請參看下一篇文章,這篇文章是關(guān)于如何下載一個免費的ActiveX控件加載到你的Form上馬上把你的VB應(yīng)用程序很簡單的設(shè)置為NT 服務(wù)。



Window95

你可能要問你自己,為什么你需要把你的應(yīng)用程序在Windows95上作為一個服務(wù)來運行。你也可能問是否Window95像WindowNT能夠把你的應(yīng)用程序作為服務(wù)來運行。

沒錯,Window95能夠想Windows NT那樣把應(yīng)用程序作為服務(wù)來運行。為什么你將能夠做到的理由就是你將在登陸之前啟動你的應(yīng)用程序。這經(jīng)常會在Web服務(wù)器以及郵件服務(wù)器上使用。因為Windows 95的安全缺乏性,把你的應(yīng)用程序作為服務(wù)將變的相當(dāng)簡單。但是這種情況對于Windows NT來說不適合(請看下面)。

在Windows95把你的應(yīng)用程序作為服務(wù)來運行是很簡單的。所有需要做的就是修改注冊表。但是對于Windows NT來說卻是一個地獄,對于Windows95,不要認(rèn)為它毫無難處。本節(jié)將給你提供一個對Windows95重要的工作。

為了在Windows95中把你的應(yīng)用程序作為一個服務(wù),增加一個字符串值到你的注冊表中:

HKLM\SOFTWARE\Microsoft\
Windows\CurrentVersion\RunServices

例如。假設(shè)你的應(yīng)用程序叫“MicroSpud“,創(chuàng)建一個字符串值,值為:MircoSpud”,并且輸入可執(zhí)行文件的全路徑到注冊表的數(shù)據(jù)域中。下面是其步驟:


Step 1: 增加一個新的字符串值


Step 2: 輸入可執(zhí)行文件路徑


Step 3: 全部完成,重新啟動,MicroSpud將在登陸前啟動

Windows 95托盤圖標(biāo)

現(xiàn)在你好記得在前面提到的“Quirk”嗎?它在這里。如果你的應(yīng)用程序啟動,并且有托盤的話,你將想閱讀這個對之地詳細說明。

當(dāng)你的應(yīng)用第一個啟動,你最有可能在Form_Load()或者Main()事件中添加你的托盤圖標(biāo)。如果通過重新啟動Windows95被設(shè)為自動登陸,那么這個問題將不存在。盡管如此,當(dāng)一個用戶強制登陸的話,將發(fā)生以下的事情:

Windows95 啟動
你的應(yīng)用程序作為服務(wù)
你的應(yīng)用程序視圖加載托盤圖標(biāo),但是失敗,因為已經(jīng)沒有托盤圖標(biāo)被加載
登陸對話框出現(xiàn)
T用戶輸入用戶名和密碼
桌面開始加載
Y你的圖標(biāo)在托盤區(qū)不會出現(xiàn)


解決方案是重復(fù)的調(diào)用Shell_NotifyIcon()API直到它返回一個TRUE布爾值。我發(fā)現(xiàn)一個來實現(xiàn)它的解決方法是加上一個計時器。計時器初始化為啟動狀態(tài),時間間隔為5秒。在調(diào)用計時器的事件(Timer1_Timer)時調(diào)用Shell_Notification()。一旦API返回TRUE值時,關(guān)閉計時器。



Window NT
你可能已經(jīng)發(fā)現(xiàn)在Windows95中設(shè)置只需要一步,但是對于WindowsNT來說,和Windows 95完全不一樣。有些人可能稱之為魔鬼,這種方法能夠在WindowNT3.51或者更高版本上使用。

為什么Window NT有很大的不同呢?其中的一個理由是因為所有在NT下的服務(wù)都有服務(wù)控制臺(Service Control Manager ,SCM)來管理。但是你的應(yīng)用程序信息仍然在注冊表里。

有更多的Keys允許應(yīng)用程序作為NT服務(wù)。



微軟意識到這個問題不僅僅發(fā)生在VB應(yīng)用程序上,而且發(fā)生在大部分應(yīng)用程序上。所以微軟提出一個解決方案,并且這個解決方案表現(xiàn)非常出色。他們開發(fā)了一個小的應(yīng)用程序。這個應(yīng)用程序在Windows NT資源包里發(fā)行,他們可以在章的后面可以得到。這個應(yīng)用程序叫

SRVANY.EXE,對你的應(yīng)用程序來說它作為一個主機(或者服務(wù)包)。換句話說,它變成一個服務(wù)程序,這個服務(wù)程序為你處理全部的苦活(Dirty Work)和以及與SCM通信。當(dāng)它啟動時,它到注冊表找出你的應(yīng)用程序的所在路徑。如果找到應(yīng)用程序,則啟動它。使用它唯一的缺點就是當(dāng)SCM關(guān)掉SRVANY時,它將使用TerminateProcess()API來殺掉你的VB應(yīng)用程序。這個是一個非常不友好的方式來關(guān)閉一個應(yīng)用程序。

你的應(yīng)用程序作為服務(wù)的配置是直接向前的(straight forward),但是并不和Windows95那樣簡單。在我向你展示一步步的操作之前。理解繼續(xù)做的事情非常重要。

這有兩個微軟開發(fā)的程序,這兩個程序欺騙它。首先是我提到的SRVANY.EXE,SRVANY位于WINNT\SYSTEM32目文件夾下。你的應(yīng)用程序也在這個文件夾下。在你想把你的應(yīng)用程序變?yōu)榉⻊?wù)的最后,它確實是一個“精華“,這個”精華“是一個真正的服務(wù)。當(dāng)你的服務(wù)啟動時,它實際上啟動的是SRVANY,SRVANY將啟動你的應(yīng)用程序。

第二個程序是微軟開發(fā)的,叫INSTSRV.EXE。這個程序安裝SRVANY來作為一個服務(wù),INSTSRV.EXE是一個通過命令行來實現(xiàn)其功能的。你先前使用的不在需要,除非你打算添加另外一個使用SRVANY的服務(wù),或者是卸載先前加的服務(wù)程序。手動保持她!

SRVANY提供了一個文檔沒這個文檔描述了你使用它的步驟。這里將指導(dǎo)你一步一步安裝SRVANY(SRVANY是基于程序“MircoSpud“的)。

假設(shè):

· 你作為Administator登陸,否則你將不能安裝一個服務(wù)

· 你的VB應(yīng)用程序“MicroSpud”位于c:\Program Files\MicroSpud\mspud.exe

· 你已經(jīng)把SRVANY。EXEINSRTSRV。EXE安裝到MicroSpud文件夾下



Step 1:使用INSTSRV。EXE安裝SRVANY。EXE作為服務(wù)



Step 2:確認(rèn)你的服務(wù)在服務(wù)控制臺(控制面板)上已被加上



Step 3: 配置你的服務(wù)設(shè)置(圖為缺省)

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:

在這一點上,你的服務(wù)已經(jīng)被創(chuàng)建。但是當(dāng)你試著啟動它時,將會失敗。你下一步必須告訴SRVANY你的VB應(yīng)用程序在哪里,因此當(dāng)SCM啟動SRVANY時SRVANY可以啟動你的應(yīng)用程序。下面這些步驟降教你完成你的新服務(wù)的安裝。



Step 1: A 添加“Parameter”關(guān)鍵字

1. 啟動注冊表編輯器

2. 在HKLM\SYSTEM\
CurrentControlSet\Services\MicroSpud 找出你的服務(wù)

3. 創(chuàng)建一個 "Parameters" 關(guān)鍵字



Step 2: 添加 "Application" 值:

1. 打開 "Parameters" 關(guān)鍵字

2. 在"Parameters" 關(guān)鍵字里創(chuàng)建一個"Application" 字符串值 (REG_SZ)

3. 編輯 "Application" 以及明確應(yīng)用程序的可執(zhí)行文件的全路徑(包括擴展路徑)



Step 3: 增加可選值(Optional Value)
雖然不是必須,但是你可能希望為“parameter”關(guān)鍵字加上一個可選值(Optional Value)

1. AppParameter(字符串)-描述你的應(yīng)用程序的任何參數(shù)

2.AppDirectory(String)-描述你的應(yīng)用程序的當(dāng)前目錄

祝賀你,你已經(jīng)成功的將你的VB程序轉(zhuǎn)化為Windows NT 服務(wù)。在這一點上,你可能很迫切測試它。因此,關(guān)閉計算機,然后重啟。你的應(yīng)用程序?qū)⒃诘顷懼皢樱⑶以谀愕淖竺娉霈F(xiàn)之前開始運行了。

這里仍然有許多的其他信息你需要知道。這些時關(guān)于SRVANY以及新的NT服務(wù)應(yīng)用程序:(盡管MicroSpud使用通過一致的例子)

注冊表值沒有大小寫之分
為了卸載你的服務(wù),使用INSTSRV。EXE,比如INSTSRV MicroSpud REMOVE
有三種方法啟動你的服務(wù):
1. 從控制面板的服務(wù)臺

2. 使用SC.EXE ,例如: SC start MicroSpud

3. 使用NET.EXE , 例如: NET START MicroSpud

有三種方法停止服務(wù)
1. 從控制面板的服務(wù)臺

2. 使用SC.EXE,例如: SC stop MicroSpud

3. 使用NET.EXE , 例如: NET STOP MicroSpud

. 當(dāng)服務(wù)停止后。它會通過Win32 TerminateProcess()API 終止應(yīng)用程序.這種終止應(yīng)用程序的方式是非常粗暴的。比如,它將允許應(yīng)用程序彈出對話框提醒用戶保存。因此,建議在關(guān)閉服務(wù)之前關(guān)閉應(yīng)用程序。
你可能多次安裝SRVANY。EXE,且使用不同的注冊表參數(shù)(比如,運行不同的目標(biāo)程序)――僅僅對于每個實例使用不同的服務(wù)名字(比如,MicroSpud1,MicroSpud2等)
如果你的VB應(yīng)用程序和桌面交互。務(wù)必通過點擊相應(yīng)服務(wù)的“設(shè)置”按鈕配置它來做到此功能。你應(yīng)該注意這些編程的考慮。為了捕獲到我們提到的消息,你學(xué)要使用一個程序比如SpyWorks。



對于WIN32圖形應(yīng)用程序:當(dāng)當(dāng)前用戶注銷后。所有的WIN32高層的窗口將收到WM_QUERYENDSESSION 和WM_ENDSESSION消息。一些WIN32應(yīng)用程序選擇在這些消息之上終止。為了你的WIN32應(yīng)用程序幸免注銷,千萬不要做:代替之的是,你的Windows過程(procedure)應(yīng)該調(diào)用在這些消息缺省的Windows過程
對于WIN32控制臺程序(比如字符模式):當(dāng)當(dāng)前登陸的用戶已經(jīng)注銷。所有的控制臺程序從控制臺收到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.
如果你的控制臺程序已經(jīng)注冊了一個控制臺事件的話(通過SettConsoleCtrlHandler),它將必須忽略CTRL_LOGOFF_EVEN事件以至幸免被注銷。


微軟也建議你:

如果SRVANY啟動你的應(yīng)用程序失敗,試著制定在注冊表里的目錄(參看“AppDirectory”注冊表關(guān)鍵字)作為當(dāng)前目錄。SRVANY可能在某個帳戶下運行,這個帳戶不同于當(dāng)前登陸用戶,因此環(huán)境變量應(yīng)該設(shè)為不一樣,比如,系統(tǒng)可能不能找到應(yīng)用程序所需要的DLL,從應(yīng)用程序的目錄運行它可能有幫助。
因為受到WindowsNT服務(wù)的限制,應(yīng)用程序能交互(有控制臺,讀取鍵盤輸入等)或者網(wǎng)絡(luò)訪問(但是兩者不能同時進行)。


服務(wù)的依賴性

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.

你應(yīng)該知道的SRVANY的一個非正式的特性(實際上適用于所有的服務(wù))是“DependOnServce”值。假設(shè)你的服務(wù)依賴其他服務(wù)。當(dāng)你的服務(wù)啟動的時候你的服務(wù)如何知道其他的服務(wù)能夠利用呢?比如,讓我們說你的服務(wù)是一個Web服務(wù)器。你將想保證TCP/IP是可用的在你的服務(wù)啟動之前。

在服務(wù)鍵(Key)下二進制值能夠加到你的服務(wù)下,還有其他的值你如“DisplayName”,“ObjectName”等。讓我們看一下下面的屏幕截圖。它反映了對于MicroSpud服務(wù),一個對TCP/IP和事件日志的依賴。為了找到服務(wù)的名稱來輸入到對話框,使用該服務(wù)的注冊表鍵(key)。比如,在HKLM\SYSTEM\CurrentControlSet\Services 下的 TCP/IP,它的鍵值是“Tcpip”;蛘邔τ谑录罩,你將輸入“EventLog” 。為了描述對于一個地依賴,使用00作為分隔符,在ASCII顯示中將顯示一個周期(.)



Windows 95 and Windows NT 服務(wù)



這篇文章吧注意力集中到配置你的VisualBasic4.0或者是5.0應(yīng)用程序在Windows95和Windows NT3.51或者更高版本下作為服務(wù)來執(zhí)行。隨著Visual Basic5.0的發(fā)布,但是VisualBasic5.0的新的兼容性對于Vb程序員來說永遠不會利用,盡管如此,你仍不能創(chuàng)建本地的NT服務(wù)。根據(jù) Desaware的廣告。他們的新SpyWorks5.0產(chǎn)品允許你繞過SRVANY創(chuàng)建Visual Basic NT服務(wù)。我將回顧一下這個產(chǎn)品(OCX服務(wù)也順便)以及在將來更新本篇文章。

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.

我希望你能發(fā)現(xiàn)這個信息是有用的。他為更進一步的VB網(wǎng)站(http://vb/duke.net)的讀者免費提供。全部或者部分地復(fù)制品被禁止。歡迎你的建議和反饋。盡管如此,我恐怕不能對SRVANY和INSTSRV提供技術(shù)支持。青聯(lián)系微軟的技術(shù)支持或者在他們的 knowledge base尋求幫助。

下載SRVANY

為了下載SRVANY.EXE, INSTSRV.EXE, 以及支持文檔。點擊下面連接。在這篇文章寫的時候(Q2 1997)是最新的版本。支持WindowsNT3.51和Windows NT 4.0

SRVANY.ZIP (24k)