2

我需要以一种快速而肮脏的方式来升级我的应用程序。

目前我每个版本都有一个 exe。

如果 exe 错误,我会闪现一条消息“在 db 上找到版本 X,您正在使用 exe 版本 Y,请下载正确的版本”。

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

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

我的想法是确定之后:

1)使用ShellExecute另一个负责下载和替换的exe(我们称之为id Update.exe)运行(这个exe可以存储在exe资源中)

2) 关闭应用程序

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

4) Update.exe 将删除 Project.exe 并用下载的替换它

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

因此将运行正确的 exe,并且用户将在与旧 exe 相同的位置拥有新的 exe。这将是一个非 hortodox 升级(不使用 Windows 更新,但相信我,我需要这个。我不使用 Windows 更新)。

你能评论一下这种方法吗?或者建议一个类似的技巧?

4

5 回答 5

4

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

于 2012-07-13T17:29:09.533 回答
3

我这样做了,它对我很有效:

OK后,在UpdateOKClick中完成:

  1. 显示进度条并使用 InternetReadFile 读取新版本的安装可执行文件并将其写入临时文件(使用系统单元中的 GetTempPath)。
  2. 显示一个消息框,说明“下载完成。关闭程序以安装新版本。”
  3. 调用 ShellExecute 从临时文件位置运行新版本的安装可执行文件。诀窍是我用两个特殊参数调用安装程序(我正在使用Inno Setup):/silent 和 /noicons。
  4. 运行 Application.Terminate 以关闭程序。

该程序立即终止,并且安装有一点延迟,因此它在程序已经关闭后开始。用户将看到 Inno Setup 显示的安装进度屏幕,但由于有两个参数,它不会询问任何问题。

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

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

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

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

于 2012-07-13T21:28:26.510 回答
2

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

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

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

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

于 2012-07-13T15:54:44.417 回答
1

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

于 2012-07-13T19:30:22.950 回答
0

我一直在做的事情,如果更新只涉及 main-exe :

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

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

为了摆脱下载的更新,可以使用一些参数调用新的 exe,例如 -doneupdating -c:\tempdownloadlocation,然后 exe 可以删除这些参数。

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

于 2012-07-15T07:36:02.320 回答