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

时间:2008-11-10 10:15:58

标签: delphi auto-update

我一直在考虑使用我自己的代码来使我的Delphi应用程序能够无缝更新,因为我将继续“经常发布,尽早发布”的心态。有各种Delphi解决方案(包括免费软件和付费),我想询问您是否使用过这些解决方案,或者只是在这个领域继续使用自己的解决方案。欢迎任何关于自动更新主题的评论。

10 个答案:

答案 0 :(得分:18)

您使用的是什么方案,知道您实际上可以重命名正在运行的.exe文件可能很方便。所以重命名文件,在新文件中复制效果很好。下次有人启动该程序时,他们将启动新版本。这在环境中非常方便,其中许多用户运行相同的.exe文件,例如在citrix /终端服务器/网络共享案例中。

答案 1 :(得分:13)

多年前,我写了一个简单的工具,它启动而不是真正的程序,检查更新,加载和安装它们(如果有的话),最后启动真正的应用程序。

如果您的程序在正确管理的环境中工作,那么该方法存在问题,用户通常对程序目录没有写入权限。您不能再在这样的环境中更新自己的程序。这就是为什么现在很多程序都带有自己的更新程序工具,可以安装它以提升权限运行,这样即使只有标准用户登录系统,也可以应用程序更新。

您必须决定是否可以假定目标受众可以在高级用户或管理员帐户上运行,或者您是否必须处理上述问题。有了Vista,事情已经变得相当困难了。

由于所有这些问题(对代理的网络访问,缺少安装目录的写入权限,需要更新更新程序本身正在使用的文件 - 仅举几例)我不会再尝试自己编写代码。更好的是检查是否有任何一种可用的解决方案可以满足您的所有需求。

答案 2 :(得分:7)

我使用Synapse例程GetHTTP返回特定资源,如果找到,则检查本地系统以查看是否需要更新。如果是这样,那么资源会告诉我要启动哪个页面,并将URL抛入shell执行以便用户执行 显示首选浏览器。

大多数情况下,下载是InnoSetup创建的安装程序,它将用户系统和数据库更新为最新版本。当需要新的“付费”升级时,我会将用户发送到“购买升级”表单。我的网页资源是ASP页面,因此我可以根据客户的版本号重定向到不同的资源。

对于主应用程序(我们的应用程序有一个服务器部分和一个客户端部分)我有一个加载器,它将检查服务器以查看服务器上的客户端文件的版本是否与客户端上的版本不同。 ..如此,它会提示用户是否要更新/恢复用户。我们选择提示用户,因为有时意外错误可能会进入系统,用户必须降级/升级特定计算机以帮助排除故障。我维护一个数据库记录,其中包含通过数据库补丁更新的最低版本,因此如果必须停用版本,则相应地更新记录。

答案 3 :(得分:6)

我也基于Indy下载和http://sourceforge.net/projects/makeupdate/创建了自己的解决方案,用于文件修补。 在此之前,我已经使用并尝试了几种商业工具,但没有人正在做我需要的工具。

答案 4 :(得分:6)

我使用TmxWebUpdate。它是免费的,简单的,让您可以很好地控制过程。我实际上拥有使用TWebUpdate的TMS组件包,但从来没有真正找到切换的理由。

修改:链接已更新

答案 5 :(得分:4)

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

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

答案 6 :(得分:4)

我使用TWebUpdate。它工作正常,有很多有趣的选项,但文档不是很好,我碰到了一些问题 - 这就是为什么我下载一个完整的安装程序,而不仅仅是文件......

我会密切关注这个问题,顺便说一句......

答案 7 :(得分:4)

我们也推出了自己的产品。它真的不太难。

我们的流程如下:

  • 当主应用程序启动时,它会检查(使用来自synapse库的func)是否有可用的更新(当然,假设它已配置为检查)。

  • 如果是这样,它会通知用户并询问他们是否要更新。

  • 如果有,它会启动更新程序.exe,并关闭主应用程序。

  • updater exe根据它检索的文本文件的内容下载新文件,并将文件保留在内存中

  • 当updater完成正确下载所有内容后,它会将下载的文件保存到磁盘,备份它替换的所有文件。这样,如果下载中断,您最终不会安装一半的文件。

  • 最后,它再次启动主应用程序,并自行关闭。

Vista的技巧是你需要在updater程序的清单中有一个条目,强制它以管理员权限运行。

答案 8 :(得分:4)

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

  1. 应用程序连接到http资源并将info文件(ini文本文件)下载到内存,检查最新版本的版本号。
  2. 如果有更新版本,app会将压缩二进制包下载到exe位置。
  3. 下载完成后,系统会要求用户重新启动应用程序。
  4. 启动时,应用程序会检查是否存在更新包
  5. 应用程序提取包内容(通常是新的应用程序exe,但也可能有其他资源,例如更新的语言文件等) - 对于每个文件,它首先将当前/旧文件重命名为临时名称,然后提取新文件。如果进程在任何时候都失败,则恢复临时文件。
  6. 完成后,app会执行新的exe并自行关闭。
  7. 不需要额外的更新程序,app exe可以自行处理。

    对于压缩包,我们使用自己的更新构建器。 该软件包包含一个文件索引,其中包含文件哈希,目标文​​件夹(主exe的相对路径)和压缩文件。 在更新期间,我们将存储的哈希值与提取的文件进行比较,以检测corupted文件。

    使用Vista,我看到两种解决方案可以使标准用户帐户实际更新应用程序文件:

    1. 配置您的设置以更改程序安装目录的权限。这样,可以在具有有限权限的帐户上修改“C:\ Program Files(x86)\ Your Company \ You App”中的文件。

      InnoSetup的示例代码是:

      [Dirs]
      Name: "{app}"; Permissions: users-modify
      
    2. 将您计划更新的文件安装到ProgramData文件夹而不是用户定义的目录,并将此目录用作覆盖文件夹。如果ProgramData中存在文件,请使用这些文件,否则请检入install dir。

      InnoSetup代码:

      [Files]
      Source: "C:\Your Project\YourApp.exe"; DestDir: "{commonappdata}\Company Name\App Name\"; 
      

答案 9 :(得分:1)

与“stg”和“GuyWithDogs”相同,我正在使用TMS的TWebUpdate。虽然文档不是很好,但它并不难学。

使用TWebUpdate,您可以选择使用的协议,可以通过HTTP,FTP或网络访问来完成。

对于通信层,TWebUpdate使用WinInet。在某些机器中,windows / IE URL缓存可能令人沮丧,因此我首先添加了一个例程来清除缓存中的自动更新服务器地址,以确保从服务器收集的信息是最新的。