Delphi編寫Windows NT中服務程式

2021-08-24 22:41:10 字數 3305 閱讀 8457

windows nt服務程式不同於一般的執行程式,它不需要nt登入進去,只需要開機進入nt系統便可以執行,一般用於系統服務方面的應用,學會編寫nt服務程式對網路管理人員而言是非常重要的,delphi作為一種高效、快速、強大的開發語言,為開發nt服務程式提供了非常便捷的方法,加上其視覺化介面以及與資料庫的完美結合,使我們開發與資料庫有關的nt服務程式變得非常簡單,下面以編寫乙個nt定期備份程式為例,介紹如何運用delphi編寫windows nt的服務程式。

將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過程中輸入以下程式:

varhour, 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);

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;

此執行緒執行時每隔一分鐘將檢查一次時間,看是否到了備份時間,如果是則將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物件上加許多非視覺化控制項來與資料庫關聯,實現很多複雜的功能。

delphi編寫仿windows記事本遇到的問題

在用delphi編寫仿windows記事本的時候在寫最後乙個選單的選單項的時候遇到的問題 通常情況下,我們需要編寫程式都需要 幫助文件 和 關於軟體 這兩項,在delphi中是怎麼實現的呢?來看看下面的 吧 uses shellapi procedure tmainform.mmimenuhelpt...

Delphi 編寫系統服務

新建乙個類,例如名字叫做tnoticethread,繼承自tthread,並重寫protected過程execute。在noticeservice的類定義中新增乙個noticethread物件。找到屬性的events選項卡,分別新增onstart,onpause,oncontinue,onstop事...

Delphi原生Windows程式

使用windows api編寫原生windows程式 program project3 uses winapi.windows,winapi.messages,system.sysutils const function windowproc window hwnd amessage uint wp...