如何把你的應用程式作為服務來運行(1)

來源:互聯網
上載者:User
程式 如何把你的應用程式作為服務來運行

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)



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。