更换当前exe的建议

时间:2012-07-13 15:36:51

标签: delphi delphi-xe2 shellexecute

我需要快速而肮脏地升级我的应用程序。

目前我每次发布都有一个exe。

如果exe错了,我会弹出一条消息“在db上找到X,你正在使用exe发布Y,请下载正确的vetsion”。

我的每个exe都有一个固定的地址,例如: http://myip.com/exes/N/Project.exe(其中N是重新发布的)

所以我的想法是代替上面的消息,我会提示用户“将下载正确的exe,按ok继续”。

我的想法是在OK之后:

1)运行ShellExecute另一个exe(让我们调用id Update.exe)来处理downlaod和replace(这个exe可以存储在exe资源中)

2)关闭应用程序

2)Update.exe将从互联网上下载正确的exe并将其保存到临时文件夹

4)Update.exe将删除Project.exe并将其替换为下载的

5)Update.exe将运行新的Project.exe

因此将运行corret exe并且用户将新exe与旧exe相同的位置。这将是一个非常规的升级(不使用Windos更新,但相信我,我需要这个。我不会更新WIndows)。

你能对这种方法发表评论吗?或者提出类似的伎俩?

5 个答案:

答案 0 :(得分:4)

我会采取略有不同的方法。我没有使用单独的exe进行下载,而是让主exe在后台线程中执行,或使用Windows BITS服务(接受HTTP URL)。这样,应用程序可以在下载过程中保持运行,并且可以在用户闲暇时重新启动。每当启动主exe时,它都可以检查temp文件夹中是否存在已完成的更新文件,如果找到则提取加载器exe,运行它并退出。加载器然后等待主exe完成退出,移动/重命名更新文件,然后运行它。

答案 1 :(得分:3)

我这样做,对我来说效果很好:

OK之后,这在UpdateOKClick中完成:

  1. 显示进度条并使用InternetReadFile读取新版本的安装可执行文件并将其写入临时文件(使用系统单元中的GetTempPath)。
  2. 显示一个消息框,说明"下载完成。关闭程序以安装新版本。"
  3. 调用ShellExecute以从临时文件位置运行新版本的安装可执行文件。诀窍是我用两个特殊参数调用安装程序(我使用Inno Setup):/ silent和/ noicons。
  4. 运行Application.Terminate关闭程序。
  5. 程序立即终止,并且安装有一点延迟,所以它在程序关闭后启动。用户将看到Inno Setup显示的安装进度屏幕,但由于这两个参数,它不会询问任何问题。

    Inno Setup安装的最后一步是启动程序。它使用/ webupdate参数调用它。

    启动程序时,它会检查是否使用了webupdate参数。如果是这样,它会对新版本进行任何初始化,然后显示一个消息框,说明"程序现在更新为版本xxx"。

    在此过程中会有很多检查和可能的消息,包括让用户随时取消选项,但基本上就是这样。

    ...而且我不必删除以前的可执行文件。它只会被覆盖。如果用户打开了第二个程序实例,那将会失败,但这是另一件需要检查的事情。

答案 2 :(得分:2)

以下是我用于本地内部应用程序的方法。它依赖于您可以在应用程序运行时重命名* .exe文件的事实。

updater类下载包含更新信息的XML文件。它将该信息与当前运行的应用程序进行比较。如果需要更新,它会下载更新的文件(基本上是文件副本,因为它们位于本地服务器上)并添加.update扩展名。然后通过添加.bak扩展名重命名当前正在运行的exe。然后将下载的文件重命名为原始exe名称,然后重新启动应用程序。

这只是一个快速概述。有检查可以解决错误或问题,以及提示用户。还有清理代码可以删除旧备份等,或者在必要时回滚到以前的版本。在某些情况下,您可以在启动时通过执行上述操作来强制执行更新,而无需用户交互。

虽然可能不是最好的方法,但它在我们的本地局域网上运行良好。

答案 3 :(得分:1)

还有另一种方法,因为无论如何你要重写文件结构: 让一个小的存根程序进行版本检查,提示(并执行)更新,然后启动实际的应用程序。

答案 4 :(得分:0)

我一直在做什么,如果只更新涉及main-exe:

  • 将新的exe下载到临时位置
  • 使用参数调用(ShellExecute)新exe,例如main.exe -update -c:\ oldlocation \
  • 关闭

我的exe文件(在这种情况下,是新的)将以特殊的“更新”模式启动,等待它应该替换为退出的exe,然后复制自身并覆盖它,运行新的exe和退出。

要删除下载的更新,可以使用-doneupdating -c:\ tempdownloadlocation等一些参数调用新的exe,然后exe可以删除。

这种方法维护起来非常简单,因为所有内容都包含在主exe中,并且可以轻松扩展以处理额外的文件