附錄B 創(chuàng)建NT服務(wù)程序_第1頁
附錄B 創(chuàng)建NT服務(wù)程序_第2頁
附錄B 創(chuàng)建NT服務(wù)程序_第3頁
附錄B 創(chuàng)建NT服務(wù)程序_第4頁
附錄B 創(chuàng)建NT服務(wù)程序_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 PAGE 552Delphi 6應(yīng)用開發(fā)指南附錄B 創(chuàng)建NT服務(wù)程序 PAGE 551Evaluation Warning: The document was created with Spire.Doc for .NET.附錄B創(chuàng)建NT服務(wù)程序服務(wù)程序通常運行在后臺,它可以使計算機更加有用。有用是相對于特定的個人或組織而言的。服務(wù)程序最好的例子是IIS服務(wù)器。當在一臺高性能的服務(wù)器或PC上安裝了IIS后,IIS就作為后臺服務(wù)運行并向瀏覽您的Web站點的人們提供Web頁面。同一領(lǐng)域的其他服務(wù)還包括FTP、SMTP以及Telnet服務(wù)器。事件日志和Windows Installer也都作為服務(wù)

2、運行。實際的程序中服務(wù)的候選者可能具有如下特征:運行時沒有活動的用戶輸入,無論是否有人登錄都需要運行。IIS是一個很好的例子。在實際開發(fā)環(huán)境中,我曾經(jīng)將不斷的傳輸并驗證事務(wù)的程序作為服務(wù)來開發(fā)。注意:Visual Basic .NET支持建立NT服務(wù)程序。Delphi直接地支持建立Windows NT(包括Windows 2000或Windows NT 5.0)服務(wù)程序。建立NT服務(wù)的功能并非對所有工具都是固有的。例如,Microsoft Visual Basic 6.0及更早的版本無法直接建立服務(wù)程序。附錄B通過示范一個自動發(fā)送IIS日志文件的程序,討論了建立Windows NT服務(wù)程序的基

3、本概念。B.1 創(chuàng)建服務(wù)程序建立服務(wù)程序最容易的方法是從New Items對話框中啟動Service Application??梢宰⒁獾竭€有一個Service項。Service可以向已有的程序添加一個TService模塊,但定義新的服務(wù)時,需要選擇Service Application。當單擊Service Application后,Delphi將創(chuàng)建一個新的工程。在新工程的.DPR源文件的uses子句中,首先引用了SvcMgr。另外,工程中還添加了一個包含TService類的單元。TService類繼承了TDataModule,可以在其中添加非可視化控件和服務(wù)程序代碼。不要在工程源文件中包括

4、Forms和HttpApp單元。SvcMgr、Forms和HttpApp都定義了一個全局的Application對象,這會導致服務(wù)程序中出現(xiàn)沖突。注意:在Forms和SvcMgr單元中確實存在全局對象Application,而在HttpApp.pas的beta版實現(xiàn)中并未發(fā)現(xiàn)Application變量。關(guān)于聯(lián)合使用這三個單元的警告摘自Delphi的幫助文件。當然,試驗總是可以的,但應(yīng)該事先預見到Application對象可能造成的沖突。服務(wù)程序是很直觀的。本書的光盤上包含了ServiceApp.dpr文件。該程序會等待一個預定義的時間量。然后將IIS的日志文件發(fā)送到指定的郵件接收者。該示例程序

5、對大部分變量進行了硬編碼,但從整本書中都可以看到,在外部對應(yīng)用程序數(shù)據(jù)進行配置是一個相當直接的過程。例如,郵件接收者、發(fā)送的信息、以及定時器間隔都可以存儲在注冊表中,無需重新編譯程序即可進行修改(第15章涵蓋了將應(yīng)用程序數(shù)據(jù)持久存儲到注冊表的內(nèi)容,第16章則涉及了INI文件的使用,因此在這里我們不再重復該信息)。服務(wù)程序的基本框架是由Delphi生成的,您只需編寫定義服務(wù)的代碼。B.1.1 定義郵件發(fā)送器服務(wù)當在服務(wù)控制管理器(即Service Control Manager或SCM,細節(jié)請參考“服務(wù)控制管理器”一節(jié))中啟動服務(wù)時,Delphi調(diào)用TService模塊中的OnExecute事件

6、方法,您可以自行定義該方法。OnExecute事件方法中所需的基本代碼是一個while循環(huán),這樣服務(wù)程序就可以處理請求。while Not Terminated doServiceThread.ProcessRequests(False);該代碼與Windows中處理信息隊列的循環(huán)非常相似。ServiceThread對象是服務(wù)程序中每個服務(wù)的專用線程。只要服務(wù)尚未被服務(wù)控制管理器停止,Not Terminated的結(jié)果都是True。由于日志文件郵件發(fā)送服務(wù)會在固定的時間間隔向接收者發(fā)送IIS日志文件,因此我們需要向OnExecute事件方法添加的代碼就是:在循環(huán)開始前使定時器生效,在循環(huán)結(jié)束后

7、使定時器失效。在示例程序中,OnExecute事件處理程序的代碼如下。procedure TMyService.ServiceExecute(Sender: TService);beginTimer1.Enabled := True;while Not Terminated doServiceThread.ProcessRequests(False);Timer1.Enabled := False;end;當服務(wù)啟動后,定時器將生效。代碼一直在while循環(huán)中運行,直至服務(wù)停止,最后定時器也將失效。當時間間隔到達后,當天的日志將發(fā)送到預先指定的接收者。執(zhí)行這些任務(wù)的代碼如下。function

8、TMyService.GetLogFileName: string;constsLogFileName =c:winntsystem32LogFilesW3SVC1exyymmdd.log;begin$IFOPT D+result := FormatDateTime( sLogFileName, EncodeDate( 2000, 12,27);$ELSEresult := FormatDateTime( sLogFileName, Date );$ENDIFend;procedure TMyService.Timer1Timer(Sender: TObject);varFileName :

9、string;beginFileName := GetLogFileName;if( Not FileExists(FileName) then exit;IdSMTP1.Connect;tryIdMessage1.Body.LoadFromFile( GetLogFileName );IdSMTP1.Send( IdMessage1 );finallyIdSMTP1.Disconnect;end;end;提示:可以將純文本嵌入到FormatDataTime函數(shù)中,把非日期掩碼的文本使用雙引號包裹起來即可。這是個有用的技巧,可用于創(chuàng)建帶有動態(tài)日期的文件名。第一個函數(shù)GetLogFileName

10、中,如果處于調(diào)試狀態(tài),那么$IFOPT D+編譯器指令生效,將使用常量文件名,否則$ELSE指令生效,將使用動態(tài)文件名。OnTimer事件確定當天的日志文件名。如果文件已存在(IIS管理器中的日志選項已生效,又有人訪問了您的站點),文件的內(nèi)容將裝載到TIdMessage的TStrings類型特性Body中(關(guān)于TIdMessage組件和Body特性的更多信息,請參見第16章)。日志文件的內(nèi)容通過已連接的TIdSTMP組件發(fā)送。可以注意到,郵件的接收者并不是動態(tài)編碼的。如果要使接收者也成為動態(tài)的,需要從某些持久性的數(shù)據(jù)源讀取必要的特性值。關(guān)于如何動態(tài)地讀取發(fā)送者、接收者以及郵件服務(wù)器的信息,可以

11、參考第16章的SimplePop3例子。B.2 安裝服務(wù)程序Delphi服務(wù)程序可以在命令行安裝,運行程序時添加/INSTALL開關(guān)即可。使用/UNINSTALL可以卸載服務(wù),而使用 /SILENT開關(guān)則可以避免顯示表示安裝或卸載的成敗情況的對話框。當安裝或卸載服務(wù)時,將顯示一個對話框,要求用戶輸入。如果服務(wù)的設(shè)置是在另一個更大的安裝過程中進行,您可能不希望掛起當前的安裝進程來等待用戶輸入;而使用 /SILENT開關(guān)就可以避免出現(xiàn)該對話框。下面的例子示范了如何從命令行安裝及卸載服務(wù)程序。Serviceapp /INSTALLServiceapp /UNINSTALLServiceapp /IN

12、STALL /SILENT前兩個例子顯示一個對話框,表示成功或失敗,而第三個例子則不顯示。服務(wù)程序?qū)嵗莝erviceap.exe。當安裝服務(wù)時,服務(wù)并不啟動。您需要打開服務(wù)控制管理器或重啟計算機來啟動服務(wù)。反過來,卸載服務(wù)時,該服務(wù)并不立即從服務(wù)列表中刪除(在Windows 2000中是這樣),直到下次打開服務(wù)控制管理器時才會刪除。在服務(wù)控制管理器中,服務(wù)并非按照服務(wù)程序的名字排序的,而是按照服務(wù)對象名排序的。從上一節(jié)的列出代碼可知,本附錄創(chuàng)建的服務(wù)類是TMyService;如果查看一下服務(wù)模塊的Name特性,可以看到服務(wù)的名字是MyService。MyService將顯示在服務(wù)控制管理器中

13、,如圖B.1所示。圖B.1 服務(wù)控制管理器,當前焦點是MyService,即本附錄創(chuàng)建的服務(wù)B.3 使用服務(wù)控制管理器圖B.1所示的服務(wù)控制管理器與VCR控件的基本功能很相似。用鼠標選定服務(wù),然后單擊Start Service按鈕即可啟動服務(wù),該按鈕與VCR中的Play按鈕類似。單擊Stop按鈕可停止服務(wù),后兩個按鈕分別是Pause和Restart。右鍵單擊服務(wù),可以顯示上下文菜單,然后打開服務(wù)屬性對話框。服務(wù)的默認行為是在重啟時自動啟動,但服務(wù)的啟動類型、登錄信息、故障恢復等設(shè)置都是可以改變的,還可以設(shè)置服務(wù)是否與桌面進行交互?!霸试S服務(wù)與桌面交互”意味著服務(wù)可以有用戶界面。例如,如果服務(wù)有

14、些選項是可由用戶配置的,那么使服務(wù)與桌面進行交互,相應(yīng)的程序?qū)@示窗體并在任務(wù)欄上顯示圖標。另外,還可以把服務(wù)作為單獨的程序運行,以便修改用戶可配置的選項。B.4 服務(wù)事件日志服務(wù)可使用LogMessage方法直接向Windows事件日志服務(wù)寫入信息。LogMessage方法定義在TService中。它有幾個可選的參數(shù),但只需傳遞一個文本字符串參數(shù)來表示要向Windows事件日志寫入的信息。LogMessage( Starting, EVENTLOG_INFORMATION_TYPE );上述LogMessage語句將把一個Application事件日志項寫入Windows事件日志,事件查看器

15、如圖B.2所示。前兩個參數(shù)(見上面的代碼)分別是將要寫入日志的文本以及表示事件類型的常數(shù)。還可以向LogMessage傳遞兩個參數(shù):第三個參數(shù)為Category值,可以是任何對用戶有意義的值,而第四個參數(shù)是信息ID號,表示與事件文件和特定的事件相關(guān)聯(lián)的文本的ID。圖B.2 Windows事件查看器,其中顯示了上述代碼中調(diào)用的TService.LogMessage產(chǎn)生的事件日志項B.5 服務(wù)的調(diào)試有兩種途徑可用于調(diào)試服務(wù)程序。第一種是在單獨的類中定義服務(wù)的工作部分,并在一個單獨的程序中對其進行調(diào)試。第二種是在服務(wù)運行時進行調(diào)試。第一種途徑是個好主意;把負責服務(wù)工作的類添加到通常的程序是測試服務(wù)行

16、為的最容易的方法,而且保持了與工作臺測試的思想的一致性。我們使用第一種方法,在創(chuàng)建ServiceApp和TestMailer(本書光盤上也有)這兩個程序時進行測試。把同樣的組件TIdMessage、TTimer和TIdSTMP添加到一個單獨的程序,然后創(chuàng)建一個郵件發(fā)送器。當找到TestMailer程序的缺陷后,所有的修改都更新到服務(wù)程序。創(chuàng)建工作臺或測試程序是很容易的,但并不總是夠用。第二種測試服務(wù)程序的途徑是:安裝并運行服務(wù)程序,然后將其附加到Delphi中的運行進程。按照下列步驟,即可在運行服務(wù)時調(diào)試ServiceApp.exe程序。在命令行運行Serviceapp.exe /INSTAL

17、L,安裝服務(wù)程序。選擇Start | Settings | Control Panel | Administrative Tools | Services,將運行Services小應(yīng)用程序。找到MyService,然后單擊Start Service工具欄按鈕(這些步驟適用于Windows 2000;在Windows NT 4.0中的步驟幾乎相同)。運行Delphi。裝載ServiceApp.dpr工程。在Delphi中選擇Run | Attach to Process菜單項。在Attach to Process對話框(如圖B.3所示)中,選中Show System Processes復選框。找

18、到ServiceApp.exe,然后單擊Attach按鈕。在Delphi中,對工程源文件的OnExecute事件方法設(shè)置斷點,然后按鍵F9。圖B.3 Attach to Process對話框可用于將Delphi調(diào)試器附加到已運行的進程上;這對于調(diào)試服務(wù)程序是很有用的Delphi將把調(diào)試器附加到運行的服務(wù)程序上,并打開CPU對話框。除非您閱讀匯編語言非常流暢,否則CPU視圖用處不大。但當服務(wù)程序運行到斷點時,將停止在斷點上并切換到Delphi代碼視圖。在用戶通過Delphi獲取對已運行服務(wù)的控制之后,即可像其他程序一樣對服務(wù)進行步進和調(diào)試。注意:作為開發(fā)者,您應(yīng)該對自己的PC具有管理員權(quán)限。令人難以置信的是,有些組織信任開發(fā)者編寫的代碼但卻不允許他們管理自己的PC。現(xiàn)在的經(jīng)濟形勢仍然很好,找一份新工作吧。Delphi幫助文檔提到,如果權(quán)限不足,那么附加到服務(wù)進程可能會失敗。當只要對PC擁有管理員權(quán)限,附加到運行的服務(wù)進程總是工作正常。幫助主題“Debugging Services”包

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論