从服务器更新EXE文件...

时间:2011-05-12 13:58:55

标签: delphi

我需要从中央服务器更新我的应用程序。

应用程序始终检查服务器安装是否为正确版本。

所以当它不是时,我需要它自我更新。

那么如果EXE正在运行,我怎么能复制它呢?我有什么解决方案?

9 个答案:

答案 0 :(得分:4)

我将当前正在运行的exe重命名为MyTempExe.exe,将新exe复制到正确的位置(如有必要,请求提升的权限),然后运行单独的应用程序以重新启动主应用程序。在启动时,我检查MyTempExe.exe是否删除它。

我使用单独的应用程序重启的原因是我没有设置时间框架让应用程序关闭并需要等待它完成它正在做的任何事情,在关机时它会将信息写入磁盘当前状态,更新的应用程序将用于恢复旧的应用程序停止的位置。

我不知道这是否是最佳解决方案,但它是我使用的解决方案。

答案 1 :(得分:4)

  • 将新的EXE下载到TEMP
  • 从EXE创建批处理,内容:

taskkill /PID %process id of running EXE%

copy %new EXE% %running EXE%

%EXE%

  • %...%中的所有值都是占位符
  • 从正在运行的EXE执行批处理
  • 删除批次

答案 2 :(得分:3)

使用Inno等安装程序打包您的应用。下载并执行安装程序。让安装程序搜索并终止您的应用程序,或指示用户关闭它。安装程序将替换您的.exe,如果该应用程序无法被杀或用户不合作,它将发出重新启动通知。

答案 3 :(得分:3)

正如你可以从所有答案中看到的那样,没有固定的方法来做到这一点,所以我想我会添加我们成功完成这个的方式。

  1. 我们从不直接从网络运行应用程序。
  2. 我们从本地计算机运行应用程序,并在启动时从网络复制。
  3. 我们使用应用程序启动器执行此操作。它下载包含应用程序文件的CRC和版本资源值的XML文件。 XML文件是在部署过程中在FinalBuilder脚本中创建的。

    然后,应用程序将XML文件与本地内容进行比较,并复制所需的文件。最后,我们启动有问题的应用程序。这适用于部署为大约300个本地用户提供服务的应用程序。最近我们从文件副本切换到HTTP下载,因为我们发现远程用户断开驱动器的问题。

    我们仍然构建安装(使用Innosetup)来获取部署的基本必需文件。

答案 4 :(得分:2)

我自己使用TMS TWebUpdate进行软件更新。优点是,如果除了普通的EXE更新之外还需要其他任何操作,可以在脚本中添加一些额外的操作。

答案 5 :(得分:2)

我有两个组件正在运行应用程序可执行文件本身和一个Web服务(SOAP),它提供版本详细信息和文件下载。

应用程序调用SOAP服务上的方法来询问项目中的文件数(通常使用application.exename来识别项目。)

soap服务从INI文件中获取其信息,该文件的条目如下:

  

[项目]

     

NumberOfFiles的= 2

     

文件1 = MyApp.exe的; 1.0.0.1

     

文件2 = MYDLL.DLL; 1.0.0.2

您只需在上传新文件的同时更新此文件。

更新应用程序的过程:

  1. 获取网络服务上可用的文件数量

  2. 对于每个文件,应用程序都要求SOAP服务器提供名称和版本号。

  3. 应用程序将此信息与其自身的版本信息进行比较,并确定文件是否需要更新,构建需要更新的本地文件列表。

  4. 对于需要更新的每个文件,应用程序将文件下载到filename.ext.new

  5. 最后,应用程序将所有filename.ext重命名为filename.ext.old,并将filename.ext.new重命名为filename.ext,然后重新启动。 (不需要外部应用程序来重新启动您自己的程序)。

  6. 注1,您可能需要提升才能替换文件,具体取决于您安装文件的位置。

    注意2:善待用户,在强制更新用户之前要仔细考虑。

    注意3:您无法删除正在运行的exe,但您可以重命名它,然后重新启动新版本。

    编辑===

    对于某些不能包含版本信息资源的参考数据文件,您可以拥有像File99 = MyDataFile; 1.1.2011这样的版本号的3个元素向客户端指示它应该检查文件日期/戳记。

答案 6 :(得分:1)

您可以拥有一个单独的更新可执行文件,其任务是检查服务器版本,必要时下载更新的可执行文件,然后运行本地可执行文件。

或者您可以在两种不同模式下运行一个可执行文件:1。启动时,检查更新,如果有,请将可执行文件下载到下载目录,运行并退出。 2.新的可执行文件将检查它是否从安装目录运行,如果没有,它会在那里复制,覆盖旧版本,从那里开始复制,然后退出。

答案 7 :(得分:1)

我的方式是反过来:如果新版本在线,请提示用户更新。如果他想要(或被迫......)我结束应用程序并启动一个新的exe(更新程序)。此更新程序加载更新并替换旧的exe(未运行)。然后它启动新的exe。准备。 (你当然也可以替换其他文件。)但是:使用像InnoSetup这样的安装程序可以提供更多的可能性并且不会与常规卸载程序混淆,所以它真的更好......

答案 8 :(得分:0)

您无需运行其他应用程序即可执行此操作。在运行时将更新从服务器推送到客户端,存储在客户端上的临时目录中。如果要升级,请将所有正在运行的文件移动到另一个临时目录,将新文件移动到原始应用程序目录中,然后在关闭时使用标准可执行文件名重新启动应用程序。

我以这种方式自动升级在无人值守的计算机上运行的客户端应用程序。