我一直在考虑使用我自己的代码来使我的Delphi应用程序能够无缝更新,因为我将继续"经常发布,尽早发布"的心态.有各种Delphi解决方案(包括免费软件和付费),我想询问您是否使用过这些解决方案,或者只是在这个领域继续使用自己的解决方案.欢迎对自动更新主题发表任何评论.
你使用什么方案,知道你可以实际重命名正在运行的.exe文件可能很方便.所以重命名文件,在新文件中复制效果很好.下次有人启动该程序时,他们将启动新版本.这在环境中非常方便,其中许多用户运行相同的.exe文件,例如在citrix /终端服务器/网络共享案例中.
几年前我写了一个简单的工具,它启动而不是真正的程序,检查更新,加载和安装它们(如果有的话),最后启动真正的应用程序.
但是,如果您的程序在正确管理的环境中工作,那么该方法存在问题,用户通常对程序目录没有写入权限.您不能再在这样的环境中更新自己的程序.这就是为什么现在许多程序都带有自己的更新程序工具,可以安装它以提升权限运行,这样即使只有标准用户登录系统,也可以应用程序更新.
您必须决定是否可以假定您的目标受众在高级用户或管理员帐户上运行,或者您是否必须处理上述问题.随着Vista的发展已经变得相当困难.
有了所有这些问题(对代理的网络访问,缺少安装目录的写权限,需要更新更新程序本身正在使用的文件 - 仅举几例)我不会再尝试自己编写代码了.更好的是检查是否有任何一种可用的解决方案可以满足您的所有需求.
我使用Synapse例程GetHTTP返回特定资源,如果找到,则检查本地系统以查看是否需要更新.如果是这样,那么资源会告诉我要启动哪个页面,然后将URL丢入shell执行,以便显示用户首选的浏览器.
大多数情况下,下载是由InnoSetup创建的安装程序,它将用户系统和数据库更新为最新版本.当需要新的"付费"升级时,我会将用户发送到"购买升级"表单.我的Web资源是ASP页面,因此我可以根据客户的版本号重定向到不同的资源.
对于主应用程序(我们的应用程序有一个服务器部分和一个客户端部分)我有一个加载器,它将检查服务器,以查看服务器上的客户端文件的版本是否与客户端上的版本不同...如果因此,它会提示用户是否要更新/恢复用户.我们选择提示用户,因为有时意外错误可能会进入系统,并且用户必须降级/升级特定计算机以帮助进行故障排除.我维护一个数据库记录,其中包含通过数据库补丁更新的最低版本,因此如果必须停用某个版本,则相应地更新记录.
我也基于Indy下载和http://sourceforge.net/projects/makeupdate/创建了我自己的解决方案,用于文件修补.在此之前,我已经使用并尝试了几种商业工具,但没有人正在做我需要的工具.
我使用TmxWebUpdate.它是免费的,简单的,让您可以很好地控制过程.我实际上拥有TWebUpdate的TMS组件包,但从来没有真正找到切换的理由.
编辑:链接已更新
我们也推出了自己的产品。它真的不是太困难。
我们的过程类似于:
启动主应用程序时,它将检查(使用synapse库中的func)是否有可用的更新(当然,假设已将其配置为进行检查)。
如果是这样,它将通知用户并询问他们是否要更新。
如果这样做,它将启动更新程序.exe,然后关闭主应用程序。
更新程序exe根据其检索到的文本文件的内容下载新文件,并将文件保存在内存中。
当更新程序正确下载所有内容后,它会将下载的文件保存到磁盘,备份它替换的所有文件。这样,如果下载中断,您最终将不会安装一半的文件。
最后,它再次启动主应用程序,并自行关闭。
使用Vista的技巧是,您需要在更新程序清单中包含一个条目,以强制其以管理员权限运行。