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...