運(yùn)用Delphi編寫Windows NT中服務(wù)程序
Windows NT服務(wù)程序不同于一般的運(yùn)行程序,,它不需要NT登錄進(jìn)去,,只需要開機(jī)進(jìn)入NT系統(tǒng)便可以運(yùn)行,一般用于系統(tǒng)服務(wù)方面的應(yīng)用,,學(xué)會編寫NT服務(wù)程序?qū)W(wǎng)絡(luò)管理人員而言是非常重要的,,Delphi作為一種高效、快速,、強(qiáng)大的開發(fā)語言,,為開發(fā)NT服務(wù)程序提供了非常便捷的方法,加上其可視化界面以及與數(shù)據(jù)庫的完美結(jié)合,,使我們開發(fā)與數(shù)據(jù)庫有關(guān)的NT服務(wù)程序變得非常簡單,,下面以編寫一個NT定期備份程序為例,介紹如何運(yùn)用Delphi編寫Windows NT的服務(wù)程序,。 打開Delphi編輯器,,選擇菜單中的File|New,在New Item中選擇Service Application項,,Delphi便自動為你建立一個基于TServiceApplication的新工程,,TServiceApplication是一個封裝NT服務(wù)程序的類,它包含一個TService1對象以及服務(wù)程序的裝卸,、注冊,、取消方法。 將TService1對象的屬性做下列更改: DisplayName與Name改為:DataBackup,,ServiceStartName屬性改為系統(tǒng)管理員用戶(如DOMAIN\Administrator)和Password則輸入用戶密碼 這樣,,服務(wù)程序運(yùn)行時將自己以該用戶的權(quán)限操作NT。 這樣,,一個NT服務(wù)程序編寫已經(jīng)完成,,在Delphi編輯器中選擇菜單Run|Parameters,在Parameters中輸入/install,,程序編譯運(yùn)行后,,一個名為DataBackup的NT服務(wù)程序已經(jīng)安裝好,,你可以雙擊控制面板中的服務(wù)項目,將會看到此服務(wù)程序,,只是此服務(wù)程序沒有任何東西而已,;在Delphi編輯器中選擇菜單Run|Parameters,在Parameters中輸入/uninstall,,程序編譯運(yùn)行后,,系統(tǒng)將會將此服務(wù)程序卸掉。 服務(wù)程序是通過控制一個線程的生成,、暫停,、繼續(xù)、停止來達(dá)到服務(wù)目的的,,因此我們必須加入一個TSession對象來編寫文件自動備份代碼,,在Delphi編輯器中選擇菜單中的File|New,在New Item中選擇Thread Object項,,Delphi會提示你為該TSession對象輸入一個名稱(輸入DataCopy),Delphi便生成了一個基于TSession的DataCopy對象,,并提供了一個Execute過程供重載,我們要Execute過程中輸入以下程序: var Hour, Min, Sec, MSec: Word; TimeStamp, DirectoryEdit1, DirectoryEdit2: String; SearchRec: TSearchRec; Source, Temp, Dest: Pchar; F, F1: THandle; FF, FF1: WIN32_FIND_DATA; Begin // 每次文件備份執(zhí)行時間 TimeStamp:= '12:00 '; // 文件備份源目錄 DirectoryEdit1:= 'C:\temp '; // 文件備份目錄 DirectoryEdit2:= 'C:\temp1 '; While True do Begin DecodeTime(Time, Hour, Min, Sec, MSec); IF Trim(TimeStamp) = Format( '%-2.2d:%-2.2d ',[Hour, Min]) then Begin GetMem(Source, 250); GetMem(Dest, 250); GetMem(Temp, 250); StrPcopy(Dest, DirectoryEdit2 + '\ ' + FormatDateTime( 'YYYYMMDD ', Date)); CreateDirectory(Dest, Nil); IF FindFirst(DirectoryEdit1 + '\*.* ', faAnyFile, SearchRec) = 0 then Begin Repeat StrPcopy(Source, DirectoryEdit1 + '\ ' + SearchRec.Name); StrPcopy(Dest, DirectoryEdit2+ '\ ' + FormatDateTime( 'YYYYMMDD ', Date) + '\ ' + SearchRec.Name); CopyFile(Source, Dest, False); Until FindNext(SearchRec) <> 0; end; SysUtils.FindClose(SearchRec); FindClose(F); FreeMem(Source, 250); FreeMem(Dest, 250); FreeMem(Temp, 250); end; Sleep(60000); end; end; 此線程執(zhí)行時每隔一分鐘將檢查一次時間,,看是否到了備份時間,,如果是則將DirectoryEdit1中的所有文件拷到DirectoryEdit2目錄中去。 現(xiàn)在編寫服務(wù)控制DataCopy線程的代碼,,在TdataBackup對象中的OnStart,、OnStop、OnPause,、OnContinue事件中分別輸入如下代碼: Procedure TDataBackup.DataBackupStart(Sender: TService; var Started: Boolean); begin DataThread:= TDataCopy.Create(False); Started := True; end; procedure TDataBackup.DataBackupStop(Sender: TService; var Stopped: Boolean); begin DataThread.Terminate; Stopped := True; end; procedure TDataBackup.DataBackupPause(Sender: TService; var Paused: Boolean); begin DataThread.Suspend; Paused := True; end; procedure TDataBackup.DataBackupContinue(Sender: TService; var Continued: Boolean); begin DataThread.Resume; Continued := True; end; 這樣一個文件自動備份程序已經(jīng)完成,,編譯好后,加上/install參數(shù)執(zhí)行程序,,系統(tǒng)會將此服務(wù)程序安裝,,由于服務(wù)程序中StartType屬性為stAuto,NT每次啟動時,,此程序自動執(zhí)行,,你可以在控制面板中的服務(wù)項目來啟動、暫停,、恢復(fù),、停止它,也可以加上/uninstall參數(shù)執(zhí)行程序來卸掉它,。通過上述例子我們可以看到,,用Delphi編寫NT服務(wù)器程序十分方便,,而且你也可以在TService對象上加許多非可視化控件來與數(shù)據(jù)庫關(guān)聯(lián),,實(shí)現(xiàn)很多復(fù)雜的功能,。 |
|