在編制了一個應用程序後的維護階段
我們會面臨給應用程序升級的工作
無疑
手工升級的工作是十分繁瑣的
你可能會需要到用戶的機器上去更新文件
可是
如果能編一個自動升級程序
放在網絡上
讓用戶下載
只需執行一下就完成升級工作
不是很方便嗎?其實
用Delphi可以很方便地編制出這樣一個程序
以下是我們的例子設我們已經有一個應用程序Thisexe要對它升級用來升級的程序為Upgradeexe
This的工程文件框架
program THIS;
uses
SysUtils
Windows
Forms
;
我們將它寫入代碼中因為這在Delphi的工程文件中是沒有自動生成的…部分是你創建的窗體部分.
Var
Fn : String;
TSI : TStartupInfo;
TPI : TProcessInformation;
{$R *RES}
begin
升級程序使用FileAge來檢查原來應用程序的建立時間如果檢測到的是舊版本則提示升級:
IF FileAge(SomeServerSomeDirthisexe) 〉 FileAge(ParamStr()) THEN
IF ApplicationMessageBox(這是一個更新版本的THISEXE+#你要得到新版本的升級文件嗎? Upgrade Time!) = THEN
Begin
運行升級程序時升級程序應與原主程序thisexe在同一目錄下如果當它啟動時這個版本主程序應該退出但要保證它不會刪除任何文件因為此時ApplicationInitialize還沒有被調用代碼如下:
Fn:= ExtractFilePath(ParamStr())+UpgradeThisexe;
FillChar(TSI SizeOf(TSI) );
TSICB := SizeOf(TSI);
IF CreateProcess (PChar(Fn) NIL NIL NIL False
DETACHED_PROCESS NIL NIL TSI TPI)
THEN Exit
但是如果升級程序由於某些原因沒有運行我們此時應該告訴用戶他能通過其他方法得到一個更新的程序版本這時我們依然退出主程序以便用戶升級如果必要的話也可以繼續裝入並運行舊版本
ELSE
Begin
messagebeep();
ApplicationMessageBox(不能完成文件拷貝+ 請手工拷貝! Copy Error!);
Exit;
End;
End;
ApplicationInitialize;
ApplicationTitle := This;
ApplicationHelpFile := Thishlp;
{autocreate forms etc}
ApplicationRun;
end
如果自動升級程序是一個控制台程序那麼一定要保證正確的控制台程序連接選項設置
program UpgradeThis;
uses
Forms
SysUtils
Windows;
Var
Fn : String;
TSI : TStartupInfo;
TPI : TProcessInformation;
{$R *RES}
begin
用CopyFile來拷貝新版本的文件同FileAge一樣它不考慮標准命名格式的路徑和文件名
IF CopyFile(SomeServerSomeDirthisexe
PChar(ExtractFilePath(ParamStr())+thisexe)False) THEN
Begin
一旦這些新版本的文件被拷貝到系統中它就應該能夠運行了而且也沒有理由不運行所以這裡基本上不需要加入出錯檢測的代碼
那麼例子中使它運行並簡單處理錯誤的代碼如下:
Fn := ExtractFilePath(ParamStr())+thisexe;
FillChar(TSI SizeOf(TSI) );
TSICB := SizeOf(TSI);
CreateProcess(PChar(Fn) NIL NIL NIL False DETACHED—PROCESS NIL NIL TSI TPI);
End
ELSE
ApplicationMessageBox(不能拷貝文件THISEXE Error! mb_OK);
end
需要注意的是在這些用來升級程序的代碼中並沒有用到任何ApplicationInitialize和ApplicationRun這些方法同樣可以被引用來作檢查新版本的幫助文件(用GetWindowsDir或GetWindowsDirectory並把Help加入到用來升級的程序中)或用來檢測升級程序是否是新的版本
上面只是從文件的更新角度說明了編制升級程序的方法但在很多情況中升級一個程序甚至要修改注冊表或各種INI的文件這些在Delphi中是比較容易實現的有興趣的朋友可以參照一些資料來加入實現這些功能的代碼
From:http://tw.wingwit.com/Article/program/Delphi/201311/24732.html