Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:如何自动更新应用程序?_Delphi_Auto Update - Fatal编程技术网

Delphi:如何自动更新应用程序?

Delphi:如何自动更新应用程序?,delphi,auto-update,Delphi,Auto Update,我一直在考虑滚动我自己的代码,以使我的Delphi应用程序能够无缝更新,因为我将采取“经常发布,尽早发布”的心态。有各种各样的德尔福解决方案(免费和付费),我想问一下,你是否使用过其中的任何一种,或者只是继续使用你自己在这方面的解决方案。欢迎对自动更新主题发表任何意见。通常我们使用第三方工具。但在某些情况下,它不可用,因此我创建了自己的解决方案,这是非常标准的: 获取包含更新信息的xml(或任何其他格式) 如果发布了较新的文件,请下载并安装它们 我也基于Indy创建了自己的解决方案,用于下载和

我一直在考虑滚动我自己的代码,以使我的Delphi应用程序能够无缝更新,因为我将采取“经常发布,尽早发布”的心态。有各种各样的德尔福解决方案(免费和付费),我想问一下,你是否使用过其中的任何一种,或者只是继续使用你自己在这方面的解决方案。欢迎对自动更新主题发表任何意见。

通常我们使用第三方工具。但在某些情况下,它不可用,因此我创建了自己的解决方案,这是非常标准的:

  • 获取包含更新信息的xml(或任何其他格式)
  • 如果发布了较新的文件,请下载并安装它们

我也基于Indy创建了自己的解决方案,用于下载和文件修补。
在此之前,我曾使用并尝试过几种商业工具,但没有人能完全满足我的需要

几年前,我编写了一个简单的工具,它代替真实的程序启动,检查更新、加载和安装(如果有),最后启动真实的应用程序

但是,如果您的程序在一个适当管理的环境中工作,而用户通常没有对程序目录的写访问权限,那么这种方法就会出现问题。在这样的环境中,您不能再简单地更新自己的程序。这就是为什么现在很多程序都有自己的更新工具,可以安装该工具以使用提升的权限运行,这样即使只有标准用户登录到系统,也可以应用程序更新

您必须决定是否可以假设您的目标受众使用超级用户或管理员帐户,或者您是否必须处理上述问题。有了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的诀窍在于,您需要在更新程序的清单中有一个条目,以强制其以管理员权限运行。

我们使用自己的解决方案,该解决方案遵循以下步骤:

  • 应用程序连接到http资源并下载信息f
    [Dirs]
    Name: "{app}"; Permissions: users-modify
    
    [Files]
    Source: "C:\Your Project\YourApp.exe"; DestDir: "{commonappdata}\Company Name\App Name\";