C++ 一个C++;二进制替换自身?

C++ 一个C++;二进制替换自身?,c++,file,launcher,C++,File,Launcher,我在一个更一般的设计背景之前。现在,我想谈谈具体情况 假设我运行了app.exe。它将update.exe下载到同一文件夹中。app.exe如何在app.exe的内容上复制update.exe?我在C++上下文中特别要求。我需要某种第三中介应用程序吗?我需要担心文件锁定吗?二进制文件更新本身最可靠的方法是什么(除非讨厌的IT人员拥有极端的文件权限)?理想的情况下,我希望看到便携解决方案(Linux + OSX),但Windows是主要目标。 < P>这是一个操作系统的特性,而不是C++。 你在用

我在一个更一般的设计背景之前。现在,我想谈谈具体情况


假设我运行了
app.exe
。它将
update.exe
下载到同一文件夹中。
app.exe
如何在
app.exe
的内容上复制
update.exe
?我在C++上下文中特别要求。我需要某种第三中介应用程序吗?我需要担心文件锁定吗?二进制文件更新本身最可靠的方法是什么(除非讨厌的IT人员拥有极端的文件权限)?理想的情况下,我希望看到便携解决方案(Linux + OSX),但Windows是主要目标。

< P>这是一个操作系统的特性,而不是C++。 你在用什么操作系统

在Windows中查看函数,在linux上只需覆盖正在运行的应用程序()

  • 将正在运行的
    app.exe
    移动/重命名为
    app\u old.exe
  • 将下载的
    update.exe
    移动/重命名为
    app.exe
  • 下次启动应用程序时,将使用更新

  • 在windows下,重命名正在运行(即锁定的dll/exe)不是问题。

    在Linux上,可以删除正在运行的程序的可执行文件,因此:

    • 下载
      app.exe ~
    • 删除正在运行的
      app.exe
    • app.exe ~
      重命名为
      app.exe
    在Windows上,无法删除正在运行的程序的可执行文件,但可以将其重命名:

    • 下载
      app.exe ~
    • 将正在运行的
      app.exe
      重命名为
      app.exe.old
    • app.exe ~
      重命名为
      app.exe
    • 重新启动时删除app.exe.old

    在Windows上,至少有一个运行的应用程序正在锁定自己的.exe文件和所有静态链接的.dll文件。这可以防止应用程序在需要防止重新启动时直接更新自身(如果重新启动正常,应用程序可以将
    MOVEFILE\u DELAY\u传递到MoveFileEx,直到\u REBOOT
    标志,并且可以自由地“覆盖”它自己的.exe,因为它会延迟)。这就是为什么应用程序通常不在自己的.exe上检查更新,而是启动一个垫片来检查更新,然后启动“真正”的应用程序。事实上,通过正确配置的清单文件,“垫片”甚至可以由操作系统本身完成。Visual Studio构建的应用程序将此作为预制向导打包工具获取,请参阅

    典型的Linux应用程序不会自我更新,因为操作系统有多种风格。大多数应用程序都是作为源代码分发的,通过某个版本的auto hell运行,以进行自我配置和构建,然后通过
    make install
    进行自我安装(所有这些都可以在一个软件包后自动完成)。即使是作为特定版本Linux的二进制文件分发的应用程序也不会复制自己,而是并行安装新版本,然后更新以“激活”新版本(同样,软件包管理软件可能会隐藏这一点)

    OSX应用程序要么属于Posix风格的Linux应用程序,要么属于为您处理更新的Mac AppStore应用程序


    我希望有一天,滚动您自己的自我更新将永远不会达到这些技术(ClickOnce、RPM、AppStore)的成熟程度,并为用户提供与发现、升级和卸载相关的预期行为。我会顺应潮流,在各自的平台上使用这些技术。

    这只是一个克服“重启”问题的想法。制作一个不需要更新的程序怎么样。只需在插件结构中实现它,因此它只是一个更新主机,它本身加载一个.dll文件,其中包含程序需要的所有功能,并在那里调用主函数。当它检测到更新时(可能在一个单独的线程中),它会告诉dll句柄关闭,替换文件并加载新的文件。
    这样,应用程序在自我更新时保持运行(仅重新加载dll文件,但应用程序保持运行)。

    像许多其他应用程序一样,使用更新程序第三个可执行文件

    • 下载新版本
    • 计划更新程序以使用新版本替换应用程序
    • 关闭主应用程序
    • 更新程序运行并完成工作
    • 更新程序运行应用程序的新版本
    • 更新程序退出

    据我所知,Windows不允许您在程序运行时覆盖EXE。在我看来,这是Windows中最烦人的事情之一。正如我在另一个问题上告诉你的,你不能覆盖正在运行的exe。我甚至一步一步地指导如何完成整个过程。@MooingDuck我知道!我仍然把你的答案作为一个高层次的设计。我只是缩小了这个问题的范围。我已经对答案相当满意了。那些持续运行的应用程序呢?在我的例子中,应用程序一直在运行,并主动探测更新(除了执行各种任务之外)。您仍然建议使用相同的更新工具吗?应用程序用户是交互式的还是守护程序/服务?像ClickOnce这样的用户交互应用程序可以通知用户。守护进程/服务类型取决于环境:在企业环境中,它们由管理员更新,管理员非常不愿意应用程序自动下载并运行新的BIT(未经测试,更重要的是,可能会受到影响)。消费者守护程序/服务将更容易销售自我更新的好处。我将其归类为守护程序/服务。从根本上说,它是用来提取数据的(在用户允许的情况下)。但是,bug会弹出。一个随机的例子可能是,人们的名字是倒排的。我希望能够推出一个小的bug修复程序,而不需要安装一个完整的软件。99%的时候,软件会在受限的权限下运行,并且不能进行自动更新