Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过写入当前正在执行的文件来更新程序 我写的C++程序迟早需要更新。我希望这需要尽可能少的与用户的交互,因为程序在后台不断运行,从不终止。我知道在正常情况下,您无法写入正在执行的文件,因此我的问题是:应用程序是否可以在不运行另一个可执行文件并让该文件接管的情况下修改自身?我不能有多个文件。_C++ - Fatal编程技术网

通过写入当前正在执行的文件来更新程序 我写的C++程序迟早需要更新。我希望这需要尽可能少的与用户的交互,因为程序在后台不断运行,从不终止。我知道在正常情况下,您无法写入正在执行的文件,因此我的问题是:应用程序是否可以在不运行另一个可执行文件并让该文件接管的情况下修改自身?我不能有多个文件。

通过写入当前正在执行的文件来更新程序 我写的C++程序迟早需要更新。我希望这需要尽可能少的与用户的交互,因为程序在后台不断运行,从不终止。我知道在正常情况下,您无法写入正在执行的文件,因此我的问题是:应用程序是否可以在不运行另一个可执行文件并让该文件接管的情况下修改自身?我不能有多个文件。,c++,C++,您应该能够向程序发送命令,告诉它终止,然后更新可执行文件,然后重新启动。它还应该保存任何状态,以便在重新启动时可以继续它停止的状态(如果有必要)。有一些语言,如脚本语言或.NET/Java,允许您修改自己的代码。但是,C++不提供任何运行时代码生成或修改工具。如果你不想改变语言,你就吃饱了。我想,您可能会使用一些非标准工具(如LLVM)来执行此操作。大多数使用自动更新功能的程序都使用另一个可执行文件来接管执行,以避免出现此问题 然而,我看到了一个简单的解决方案: 旧程序将新程序下载到临时位置

您应该能够向程序发送命令,告诉它终止,然后更新可执行文件,然后重新启动。它还应该保存任何状态,以便在重新启动时可以继续它停止的状态(如果有必要)。

有一些语言,如脚本语言或.NET/Java,允许您修改自己的代码。但是,C++不提供任何运行时代码生成或修改工具。如果你不想改变语言,你就吃饱了。我想,您可能会使用一些非标准工具(如LLVM)来执行此操作。

大多数使用自动更新功能的程序都使用另一个可执行文件来接管执行,以避免出现此问题

然而,我看到了一个简单的解决方案:

  • 旧程序
    新程序
    下载到临时位置
  • 旧程序
    启动
    新程序
    (可能带有特殊参数)并自行终止
  • 新程序
    旧程序
    上复制自身(运行中的程序可以读取自身,只要不打开自身进行写入)
  • new program
    使用特殊参数运行
    new program(copy)
    ,然后自行终止
  • 新程序(复制)
    删除
    新程序
    并恢复正常操作

够清楚吗?:)

从哪里发送命令?正在尝试自我更新的程序?还是从一个单独的更新程序?我想用户想要写自我修改的代码。如果程序终止,我怎么才能到达“更新可执行文件”部分?如果自我修改的代码(我没有经验)意味着要写汇编,那么我必须采取另一种方法。这些更改必须保存到磁盘上,以备计算机关机时使用。我尽量不鼓励代码自我修改。我的意思是一个单独的更新程序,或者只是程序本身的新副本,告诉旧副本退出(见下面/上面SirDarius的答案)。@moogoo:你会让你的更新程序在杀死旧版本并复制新版本后启动可执行文件的新副本。为什么不能有多个文件?这太荒谬了。这是一个要求,因为它将被部署在一个环境中,所以没有办法绕过它。是的,这实际上是有道理的。我会仔细考虑一下,看看是否有可能这样做。深思熟虑的回答,有人帮我更新。根据操作系统的不同,你可以重命名正在运行的可执行文件的文件。这将允许您重命名现有文件,将新文件移动到正确的名称,然后直接从正确的名称运行它。这样就为您节省了一些步骤。