【问题标题】:Delphi: How do you auto-update your applications? [closed]Delphi:您如何自动更新您的应用程序? [关闭]
【发布时间】:2010-09-21 14:35:29
【问题描述】:

我一直在考虑滚动我自己的代码,以使我的 Delphi 应用程序能够无缝更新,因为我将进一步追求“经常发布,尽早发布”的心态。那里有各种 Delphi 解决方案(免费软件和付费软件),我想问一下您是否一直在使用其中的任何一个,或者只是继续在该领域使用您自己的解决方案。欢迎任何关于自动更新主题的 cmets。

【问题讨论】:

    标签: delphi auto-update


    【解决方案1】:

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

    【讨论】:

    • Win7 和 Win10 仍然如此吗? :D
    • 这篇文章应该被标记为解决方案
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 因为这个问题,我进入了这个话题。我的程序甚至不能写当前的exe.bak。似乎在 Windows (w10v1909) 上更改了整个权限,之前一切正常。 :(
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我也创建了自己的解决方案,基于 Indy 进行下载,http://sourceforge.net/projects/makeupdate/ 用于文件修补。 在此之前,我使用并尝试了几种商业工具,但没有人能完全满足我的需求。

      【讨论】:

        【解决方案5】:

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

        编辑:链接已更新

        【讨论】:

        【解决方案6】:

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

        我们的流程是这样的:

        • 当主应用程序启动时,它会检查(使用突触库中的函数)是否有可用的更新(当然,假设它被配置为检查)。

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

        • 如果这样做,它会启动一个更新程序 .exe,并关闭主应用程序。

        • 更新程序 exe 根据其检索到的文本文件的内容下载新文件,并将文件保存在内存中

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

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

        Vista 的诀窍是您需要在更新程序的清单中有一个条目,以强制它以管理员权限运行。

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

            我会留意这个问题,顺便说一句...

            【讨论】:

            • 我也使用 TWebUpdate。 stg 说明了一切 - 它有效,但文档可能会更好。但是,通过他们的新闻组和支持电子邮件提供的在线支持很好。它足够便宜,您可以负担得起在添加其他功能时试用它是否足够好。
            【解决方案9】:

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

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

            无需额外的更新程序,应用程序 exe 可以自行处理。

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

            在 Vista 中,我看到两种解决方案可以让标准用户帐户真正更新应用程序文件:

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

              InnoSetup 的示例代码如下:

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

              InnoSetup 代码:

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

            【讨论】:

            • 仅供参考,Inno 设置有一个命令行选项 /DIR="" 可用于覆盖 DestDir - 我在运行下载的 Inno 设置并替换 包含应用实际安装的文件夹。
            • 授予用户修改“程序文件”目录(或其子文件夹)中文件的权限是一个非常大的安全问题!如果用户感染了任何病毒,可以代表用户修改您的程序代码!
            • 最好:1)创建一个具有复杂密码的本地用户,专门用于更新(只有你的更新者需要知道这个密码,即没有其他人可以使用该用户登录!); 2) 授予该用户修改程序文件夹内容的权限; 2)将更新程序创建为服务; 3)将服务设置为以专用用户身份运行;
            • @iPath 如果我在我的计算机上安装一个创建新用户的程序并在我的计算机上保持服务运行,我也会非常担心,即使你有“好意”也会非常可疑,某些防病毒软件可能会弹出一个巨大的警告对话框。
            • @Vitim.us 尝试安装,例如 MS SQL Server。它出于相同/相似的原因为其服务创建了一堆用户,您有 IIS 帐户(IWAM/IUSR),UAC 采用类似的方法(不包括过滤令牌,这是其他主题)等。“用户帐户”是唯一的一个真正的安全边界。很少使用,不会让人怀疑/不好?
            【解决方案10】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-17
              • 1970-01-01
              • 2015-07-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多