楊 超
在編制了一個應(yīng)用程序后的維護階段,我們會面臨給應(yīng)用程序升級的工作.無疑,手工升級的工作是十分繁瑣的,你可能會需要到用戶的機器上去更新文件.可是,如果能編一個自動升級程序,放在網(wǎng)絡(luò)上,讓用戶下載,只需執(zhí)行一下就完成升級工作,不是很方便嗎?其實,用Delphi可以很方便地編制出這樣一個的程序.
以下是我們的例子,設(shè)我們已經(jīng)有一個應(yīng)用程序This.exe,要對它升級,用來升級的程序為Upgrade.exe.
1.This的工程文件框架
program THIS;
uses
SysUtils,
Windows,
Forms,
...;
我們將它寫入代碼中,因為這在Delphi的工程文件中是沒有自動生成的.“…”部分是你創(chuàng)建的窗體部分
Var
Fn : String;
TSI : TStartupInfo;
TPI : TProcessInformation;
{$R *.RES}
begin
“升級程序”使用FileAge來檢查原來應(yīng)用程序的建立時間,如果檢測到的是舊版本,則提示升級:
IF FileAge(‘SomeServerSomeDirthis.exe‘) 〉 FileAge(ParamStr(0)) THEN
IF Application.MessageBox(‘這是一個更新版本的THIS.EXE.‘+#13‘你要得到新版本的升級文件嗎?‘, ‘Upgrade Time!‘,1) = 1 THEN
Begin
運行升級程序時,升級程序應(yīng)與原主程序this.exe在同一目錄下.如果當(dāng)它啟動時,這個版本主程序應(yīng)該退出,但要保證它不會刪除任何文件,因為此時Application.Initialize還沒有被調(diào)用.代碼如下:
Fn:= ExtractFilePath(ParamStr(0))+‘UpgradeThis.exe‘;
FillChar(TSI, SizeOf(TSI), 0);
TSI.CB := SizeOf(TSI);
IF CreateProcess (PChar(Fn), NIL, NIL, NIL, False,
DETACHED_PROCESS, NIL, NIL, TSI, TPI)
THEN Exit
但是,如果“升級程序”由于某些原因沒有運行,我們此時應(yīng)該告訴用戶,他能通過其他方法得到一個更新的程序版本,這時我們依然退出主程序以便用戶升級.如果必要的話,也可以繼續(xù)裝入并運行舊版本.
ELSE
Begin
messagebeep(0);
Application.MessageBox(‘不能完成文件拷貝.‘+‘ ‘ 請手工拷貝!.‘, ‘Copy Error!‘,1);
Exit;
End;
End;
Application.Initialize;
Application.Title := ‘This‘;
Application.HelpFile := ‘This.hlp‘;
{autocreate forms, etc.}
Application.Run;
end.
如果自動升級程序是一個控制臺程序,那么一定要保證正確的控制臺程序連接選項設(shè)置.
program UpgradeThis;
uses
Forms,
SysUtils,
Windows;
Var
Fn : String;
TSI : TStartupInfo;
TPI : TProcessInformation;
{$R *.RES}
begin
用CopyFile來拷貝新版本的文件,同F(xiàn)ileAge一樣,它不考慮標(biāo)準(zhǔn)命名格式的路徑和文件名.
IF CopyFile(‘SomeServerSomeDirthis.exe‘,
PChar(ExtractFilePath(ParamStr(0))+‘this.exe‘),False) THEN
Begin
一旦這些新版本的文件被拷貝到系統(tǒng)中,它就應(yīng)該能夠運行了,而且也沒有理由不運行.所以,這里基本上不需要加入出錯檢測的代碼.
那么,例子中使它運行并簡單處理錯誤的代碼如下:
Fn := ExtractFilePath(ParamStr(0))+‘this.exe‘;
FillChar(TSI, SizeOf(TSI), 0);
TSI.CB := SizeOf(TSI);
CreateProcess(PChar(Fn), NIL, NIL, NIL, False, DETACHED—PROCESS, NIL, NIL, TSI, TPI);
End
ELSE
Application.MessageBox(‘不能拷貝文件THIS.EXE‘, ‘Error!‘, mb_OK);
end.
需要注意的是,在這些用來升級程序的代碼中,并沒有用到任何Application.Initialize和Application.Run.這些方法同樣可以被引用來作檢查新版本的幫助文件(用GetWindowsDir或GetWindowsDirectory并把“Help”加入到用來升級的程序中)或用來檢測“升級程序”是否是新的版本.
上面只是從文件的更新角度說明了編制“升級程序”的方法,但在很多情況中升級一個程序甚至要修改注冊表或各種INI的文件,這些在Delphi中是比較容易實現(xiàn)的,有興趣的朋友可以參照一些資料來加入實現(xiàn)這些功能的代碼.
|