在编制了一个应用程序后的维护阶段
我们会面临给应用程序升级的工作
无疑
手工升级的工作是十分繁琐的
你可能会需要到用户的机器上去更新文件
可是
如果能编一个自动升级程序
放在网络上
让用户下载
只需执行一下就完成升级工作
不是很方便吗?其实
用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中是比较容易实现的有兴趣的朋友可以参照一些资料来加入实现这些功能的代码