Delphi:如何自动更新应用程序?
我一直在考虑滚动我自己的代码,以使我的Delphi应用程序能够无缝更新,因为我将采取“经常发布,尽早发布”的心态。有各种各样的德尔福解决方案(免费和付费),我想问一下,你是否使用过其中的任何一种,或者只是继续使用你自己在这方面的解决方案。欢迎对自动更新主题发表任何意见。通常我们使用第三方工具。但在某些情况下,它不可用,因此我创建了自己的解决方案,这是非常标准的:Delphi:如何自动更新应用程序?,delphi,auto-update,Delphi,Auto Update,我一直在考虑滚动我自己的代码,以使我的Delphi应用程序能够无缝更新,因为我将采取“经常发布,尽早发布”的心态。有各种各样的德尔福解决方案(免费和付费),我想问一下,你是否使用过其中的任何一种,或者只是继续使用你自己在这方面的解决方案。欢迎对自动更新主题发表任何意见。通常我们使用第三方工具。但在某些情况下,它不可用,因此我创建了自己的解决方案,这是非常标准的: 获取包含更新信息的xml(或任何其他格式) 如果发布了较新的文件,请下载并安装它们 我也基于Indy创建了自己的解决方案,用于下载和
- 获取包含更新信息的xml(或任何其他格式)
- 如果发布了较新的文件,请下载并安装它们
在此之前,我曾使用并尝试过几种商业工具,但没有人能完全满足我的需要 几年前,我编写了一个简单的工具,它代替真实的程序启动,检查更新、加载和安装(如果有),最后启动真实的应用程序 但是,如果您的程序在一个适当管理的环境中工作,而用户通常没有对程序目录的写访问权限,那么这种方法就会出现问题。在这样的环境中,您不能再简单地更新自己的程序。这就是为什么现在很多程序都有自己的更新工具,可以安装该工具以使用提升的权限运行,这样即使只有标准用户登录到系统,也可以应用程序更新 您必须决定是否可以假设您的目标受众使用超级用户或管理员帐户,或者您是否必须处理上述问题。有了Vista,事情已经变得相当困难了 有了所有这些问题(通过代理的网络访问、缺少安装目录的写入权限、需要更新更新程序本身正在使用的文件——仅举几个例子),我不会再尝试自己编写代码了。最好检查是否有任何一个可用的解决方案满足了您的所有需要。我使用例程GetHTTP返回特定的资源,如果找到了,则检查本地系统以查看是否需要更新。如果是这样的话,那么资源会告诉我要启动哪个页面,我会将URL放入shell中,以便用户执行 将显示首选浏览器 大多数情况下,下载是由InnoSetup创建的安装程序,它将用户系统和数据库更新为最新版本。当需要新的“付费”升级时,我会将用户发送到“购买升级”表单。我的web资源是ASP页面,因此我可以根据客户的版本号重定向到其他资源
对于主应用程序(我们的应用程序有一个服务器部分和一个客户端部分),我有一个加载器,它将检查服务器上的客户端文件版本是否与客户端上的版本不同……如果是,它将提示用户是否要更新/恢复。我们选择提示用户,因为有时一个意外的bug可能会进入系统,用户只能降级/升级特定的机器来帮助解决问题。我维护的数据库记录具有所需的最低版本,该版本通过数据库修补程序更新,因此,如果必须停用某个版本,则会相应地更新该记录。无论您使用什么方案,都可以方便地知道您实际上可以重命名正在运行的.exe文件。所以重命名文件,在新文件中复制效果很好。下一次有人启动该程序时,他们将启动一个新版本。在许多用户运行相同的.exe文件的环境中,这当然非常方便,比如在citrix/终端服务器/网络共享案例中。它工作正常,有很多有趣的选项,但文档不是很好,我确实遇到了一些问题-这就是为什么我下载了完整的安装程序,而不仅仅是文件 顺便说一句,我会关注这个问题。我用的是。它是免费的,简单的,让你很好的控制过程。我实际上拥有TWebUpdate的TMS组件包,但从未真正找到切换的好理由 编辑:链接更新与“stg”和“GuyWithDogs”相同,我使用的是来自TMS的TwebuUpdate。虽然文档不是很好,但学习起来并不难 使用TwebuUpdate,您可以选择使用什么协议,可以通过HTTP、FTP或网络访问来完成
对于通信层,TwebuUpdate使用WinInet。在某些机器中,windows/IE URL缓存可能会被破坏,因此我添加了一个例程,首先从缓存中清除自动更新服务器地址,以确保从服务器收集的信息是最新的。我们也推出了自己的。这真的不太难 我们的过程大致如下:
- 当主应用程序启动时,它会检查(使用synapse库中的funcs)是否有可用的更新(当然,假设其配置为检查)
- 如果是这样,它会通知用户并询问他们是否想要更新
- 如果他们这样做,它会启动updater.exe,并关闭主应用程序
- updater exe根据检索到的文本文件的内容下载新文件,并将文件保留在内存中
- 当更新程序正确下载完所有内容后,它会将下载的文件保存到磁盘,备份它所替换的任何文件。这样,如果下载被中断,您就不会安装一半的文件
- 最后,它再次启动主应用程序,并自行关闭
Vista的诀窍在于,您需要在更新程序的清单中有一个条目,以强制其以管理员权限运行。我们使用自己的解决方案,该解决方案遵循以下步骤:
[Dirs]
Name: "{app}"; Permissions: users-modify
[Files]
Source: "C:\Your Project\YourApp.exe"; DestDir: "{commonappdata}\Company Name\App Name\";