?? 運用delphi編寫windows nt中服務程序 (2000年8月.txt
字號:
運用Delphi編寫Windows NT中服務程序 (2000年8月22日)
本站更新 分類: 作者:胡佩敏 推薦: 閱讀次數:707
(http://www.codesky.net)
--------------------------------------------------------------------------------
運用Delphi編寫Windows NT中服務程序
湖北省荊州市
胡佩敏
---- Windows NT服務程序不同于一般的運行程序,它不需要NT登錄進去,只需要開機進入
NT系統便可以運行,一般用于系統服務方面的應用,學會編寫NT服務程序對網絡管理人員而
言是非常重要的,Delphi4.0作為一種高效、快速、強大的開發語言,為開發NT服務程序提供
了非常便捷的方法,加上其可視化界面以及與數據庫的完美結合,使我們開發與數據庫有關
的NT服務程序變得非常簡單,下面以編寫一個NT定期備份程序為例,介紹如何運用Delphi編
寫Windows NT的服務程序。
---- 打開Delphi編輯器,選擇菜單中的File|New,在New Item中選擇Service Application
項,Delphi便自動為你建立一個基于TServiceApplication的新工程,TserviceApplication
是一個封裝NT服務程序的類,它包含一個Tservice1對象以及服務程序的裝卸、注冊、取消方
法。
---- 將Tservice1對象的屬性做下列更改:
DisplayName與Name改為:DataBackup,
ServiceStartName屬性改為系統管理員
用戶(如DOMAIN\Administrator)和Password則輸入用戶密碼
---- 這樣,服務程序運行時將自己以該用戶的權限操作NT。
---- 這樣,一個NT服務程序編寫已經完成,在Delphi編輯器中選擇菜單Run|Parameters,在
Parameters中輸入/install,程序編譯運行后,一個名為DataBackup的NT服務程序已經安裝好
,你可以雙擊控制面板中的服務項目,將會看到此服務程序,只是此服務程序沒有任何東西而
已;在Delphi編輯器中選擇菜單Run|Parameters,在Parameters中輸入/uninstall,程序編譯
運行后,系統將會將此服務程序卸掉。
---- 服務程序是通過控制一個線程的生成、暫停、繼續、停止來達到服務目的的,因此我們
必須加入一個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
{每次文件備份執行時間}
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);
IFFindFirst(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;
---- 此線程執行時每隔一分鐘將檢查一次時間,看是否到了備份時間,如果是則將
DirectoryEdit1中的所有文件拷到DirectoryEdit2目錄中去。
---- 現在編寫服務控制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;
---- 這樣一個文件自動備份程序已經完成,編譯好后,加上/install參數執行程序,系統會
將此服務程序安裝,由于服務程序中StartType屬性為stAuto,NT每次啟動時,此程序自動執
行,你可以在控制面板中的服務項目來啟動、暫停、恢復、停止它,也可以加上/uninstall
參數執行程序來卸掉它。通過上述例子我們可以看到,用Delphi編寫NT服務器程序十分方便,
而且你也可以在Tservice對象上加許多非可視化控件來與數據庫關聯,實現很多復雜的功能。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -