delphi:你如何自动更新你的应用程序?

我一直在想我自己的代码,使我的Delphi应用程序无缝更新,因为我会去“经常发布,早期发布”的心态。 有各种各样的delphi解决scheme(包括免费软件和付费),我想问问你们是否使用过其中的任何一个,或者只是继续在这个领域的自己的解决scheme。 有关自动更新主题的任何意见,欢迎。

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

但是,如果您的程序在正确的pipe理环境中工作,那么用户通常不具有对程序目录的写入权限,这种方法存在问题。 你不能再在这种环境下简单地更新自己的程序。 这就是为什么现在很多程序都带有自己的更新工具,可以使用更高的权限进行安装,以便即使只有标准用户login到系统,也可以应用程序更新。

您必须决定您的目标受众是否可以被假设为以高级用户或pipe理员帐户运行,或者是否需要处理上述问题。 随着Vista的事情变得相当困难。

由于所有这些问题(对代理的networking访问,缺less安装目录的写入权限,需要更新updater本身正在使用的文件 – 仅举几例),我不会再尝试自己编写这个代码。 更好地检查是否有任何可用的解决scheme是否你所需要的。

你使用什么scheme,知道你实际上可以重命名正在运行的.exe文件可能是方便的。 所以重命名文件,复制新文件的作品很好。 下一次有人推出这个程序,他们将推出一个新的版本。 在许多用户运行相同的.exe文件的情况下,这是非常方便的,例如在citrix /terminal服务器/networking共享情况下。

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

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

对于主应用程序(我们的应用程序有一个服务器部分和一个客户端部分),我有一个加载程序将检查服务器,以查看服务器上的客户端文件的版本是否不同于客户端上的版本…如果所以,它提示用户是否要更新/恢复用户。 我们select提示用户,因为偶然的错误可能会使系统进入系统,用户必须只降级/升级特定的机器来帮助排除故障。 我维护一个数据库logging,所需的最低版本是通过数据库补丁更新的,所以如果一个版本必须被淘汰,logging会相应更新。

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

我使用TmxWebUpdate 。 它是免费的,简单的,并给你很好的控制过程。 我实际上拥有TWebUpdate的TMS组件包,但从来没有真正find切换的好理由。

编辑:链接更新

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

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

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

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

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

我们的过程如下所示:

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

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

  • 如果他们这样做,它会启动更新程序.exe,并closures主应用程序。

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

  • 当更新程序完成正确的下载后,它会将下载的文件保存到磁盘,备份所有replace的文件。 这样,如果下载得到中断,你不会结束一半的文件安装。

  • 最后,它再次启动主应用程序,并closures自己。

w / Vista的诀窍是你需要在updater程序的清单中有一个条目来强制它以pipe理员权限运行。

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

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

没有额外的更新需要,应用程序exe可以处理它本身。

对于压缩包,我们使用我们自己的更新构build器。 该软件包包含文件索引,包括文件散列,目标文件夹(主要exe文件的相对path)和压缩文件。 在更新期间,我们将存储的散列与提取的文件进行比较,以检测出corupted文件。

在Vista中,我看到了两个解决scheme来启用标准用户帐户来实际更新应用程序文件:

  1. configuration您的设置以更改程序安装目录的权限。 通过这种方式可以在具有有限权限的账户上修改“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\"; 

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

使用TWebUpdate,您可以select使用什么协议,可以通过HTTP,FTP或networking访问来完成。

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