2012-02-06 84 views
23

asked this question在更一般的設計上下文中。現在,我想談談具體細節。C++二進制文件如何替換它自己?

想象一下,我有app.exe正在運行。它將update.exe下載到相同的文件夾中。 app.exe如何複製update.exe超過app.exe的內容?我在C++上下文中具體詢問。我需要某種第三方介體應用嗎?我需要擔心文件鎖定嗎?什麼是最強大的二進制更新方法(禁止令人討厭的IT人員擁有極高的文件權限)?理想情況下,我希望看到便攜式解決方案(Linux + OSX),但Windows是主要目標。

+0

據我所知,在程序運行時,Windows不會讓你覆蓋EXE。這是Windows中最令人討厭的事情之一,imo。 – unwind 2012-02-06 16:01:08

+1

正如我在另一個問題上告訴你的,你無法覆蓋正在運行的exe文件。我甚至一步一步地指導如何完成整個過程。 – 2012-02-06 16:27:38

+0

@MooingDuck我知道!我仍然將您的答案作爲高級設計參考。我只是縮小了這個問題的範圍。我已經很滿意答案了。 – TheBuzzSaw 2012-02-06 17:29:29

回答

35
  1. 移動/重命名你的跑步app.exeapp_old.exe
  2. 移動/重命名你的下載update.exeapp.exe
  3. 隨着您的應用程序的下一次開始將使用更新

重命名運行即鎖定的DLL/EXE不是Windows下的問題。

+7

不知道你可以重命名正在運行的可執行文件! – 2012-02-06 16:28:14

+0

這對我來說很好,用我的更新程序修復了雞和蛋的問題。 – Boccobrock 2013-11-05 22:04:47

9

這是一個操作系統功能 - 不是C++。
你在什麼操作系統上?

在Windows中看到MoveFileEx()功能,在Linux上簡單地覆蓋正在運行的應用程序(Replacing a running executable in linux

+0

+1爲鏈接到其他主題。 Linux解決方案非常棒! – Nawaz 2012-02-06 16:13:26

7

在Linux上,可以刪除正在運行的程序的可執行文件,因此:

  • 下載app.exe~
  • 刪除運行app.exe
  • 重命名app.exe~app.exe

在Windows上,無法刪除正在運行的程序的可執行文件,但可以重命名它:

  • 下載app.exe~
  • 重命名運行app.exeapp.exe.old
  • 重命名app.exe~app.exe
  • 重啓刪除app.exe.old
2

在Windows上,當至少一個應用程序的運行被鎖定自己的.exe文件和所有靜態鏈接的.dll文件。這可以防止應用程序直接更新自己,如果它希望阻止重新啓動(如果重新啓動可以,應用程序可以將MOVEFILE_DELAY_UNTIL_REBOOT標誌傳遞給MoveFileEx並可自由'覆蓋'它自己的.exe,如無論如何都會延遲)。這就是爲什麼通常應用程序不會檢查自己的.exe更新,但他們啓動一個墊片,檢查更新,然後啓動「真正的」應用程序。事實上,'shim'甚至可以由操作系統本身完成,憑藉一個正確配置的清單文件。 Visual Studio構建的應用程序將其作爲預製嚮導打包工具,請參閱ClickOnce Deployment for Visual C++ Applications

典型的Linux應用程序並沒有自行更新,因爲許多OS的許多風格。大多數應用程序是作爲源代碼分發的,可以通過某些版本的自動地獄來自行配置和構建自己,然後通過make install進行安裝(所有這些都可以在包後自動執行)。即使是作爲Linux的特定版本的二進制文件分發的應用程序也不會自己複製,而是並排安裝新版本,然後更新symbolic link以「激活」新版本(同樣,軟件包管理軟件可能會隱藏這個)。

如果OS X應用程序屬於Posix風格,或者屬於爲您處理更新的Mac AppStore應用程序存儲區,則OS X應用程序可能屬於Linux存儲桶。

我會推動自己的自我更新永遠不會達到這些技術(ClickOnce,RPMs,AppStore)的複雜性,併爲用戶提供發現,升級和卸載的預期行爲。我會順應潮流,在各自的平臺中使用這些技術。

+0

持續運行的應用程序如何?就我而言,應用程序一直運行並主動探測更新(除執行各種任務外)。你還會推薦使用這些相同的更新工具嗎? – TheBuzzSaw 2012-02-06 17:31:39

+0

是應用程序用戶交互式還是守護程序/服務?像ClickOnce這樣的用戶交互式應用可以通知用戶。守護進程/服務類型取決於環境:在企業環境中,它們由管理員更新,管理員非常不願意應用程序自動下載並運行新位(未經測試,更重要的是可能受到損害)。消費者守護程序/服務可以更輕鬆地銷售自我更新的好處。 – 2012-02-06 17:35:13

+0

我會將它歸類爲一個守護進程/服務。基本上,它是在那裏提取數據(如用戶所允許的)。但是,錯誤彈出。一個隨機的例子可能是人們的名字倒退了。我希望能夠推出一個小錯誤修復程序,而不需要全面安裝軟件。 – TheBuzzSaw 2012-02-06 17:48:09

2

只是一個想法來克服「重啓」問題。如何製作一個程序,並不需要更新。只需在插件結構中實現它,所以它只是一個更新主機,它本身會加載一個.dll文件,並具有程序所需的所有功能,並在那裏調用主函數。當它檢測到更新(可能在一個單獨的線程中)時,它會告訴dll句柄關閉,替換文件並加載新文件。 這樣,您的應用程序會在更新自身時保持運行(只重新加載dll文件,但應用程序仍在運行)。

0

像很多其他應用程序一樣使用updater 3rd可執行文件。

  • 下載新版本。
  • 安排更新程序以使用新版本替換應用程序。
  • 關閉主應用程序。
  • 更新程序運行並完成工作。
  • 更新程序運行新版本的應用程序。
  • 更新程序退出。
相關問題