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
- 下载
app.exe ~
- 将正在运行的
重命名为app.exe
app.exe.old
- 将
重命名为app.exe ~
app.exe
- 重新启动时删除app.exe.old
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文件,但应用程序保持运行)。像许多其他应用程序一样,使用更新程序第三个可执行文件
- 下载新版本
- 计划更新程序以使用新版本替换应用程序
- 关闭主应用程序
- 更新程序运行并完成工作
- 更新程序运行应用程序的新版本
- 更新程序退出