天天看點

VC做的程式如何做到自動更新? VC做的程式如何做到自動更新?

VC做的程式如何做到自動更新?

   這個非常簡單,把新程式打包放到你的伺服器上,外加一個配置說明檔案(ini或xml)。你的程式跑起來的時候,啟動一個慢線程,下載下傳你的配置說明檔案(ini或xml),與本地的進行對照,如果一緻就直接退出,如果有更新就接着下載下傳到一個臨時目錄。這都是小意思了,重點是怎麼覆寫原來的相應檔案,因為系統跑起來的時候,檔案是不能被删除和覆寫的。

我的做法有四種

一是如果隻是某EXE或DLL有變化,那麼先把本地的改名,然後直接拷貝覆寫就可以了(當然你得想辦法删除改名後的檔案)。我現在做的浏覽器是用這個方法的,不過還有改進的空間,現在是隻圖簡單。

二是額外寫一個DLL檔案,我取名為AutoCopy.dll,這個子產品其實隻是拷貝檔案而已。在我的工作系統退出的時候,通過rundll32.exe來調用我的AutoCopy.dll(再附加一些參數),然後自己的系統退出。AutoCopy.dll被rundll32.exe加載之後,一直等待到工作系統退出,然後再從附加的參數中解析出需要拷貝的檔案進行拷貝操作。而還可以做得更好一些,就是AutoCopy.dll做為工作系統的資源,需要的時候再動态寫到檔案中執行,完了之後可以自删除(比EXE檔案簡單許多)。這個方法以前做大型系統的時候使用過。

三是用一個沒有什麼具體功能的EXE(暫稱為shell.exe)來調用真正有意義的功能子產品,shell.exe負責判斷工作系統的版本并下載下傳相關的元件,在适當的時候關閉并覆寫工作系統。由于shell.exe很功能很單一,幾乎不需要再更新了。當然也可以做得更好,就是工作系統在适應的時候更新shell.exe,呵呵。這個方案眼前正在使用。

第四方案與三差不多,不過功能子產品不是普通的EXE或DLL,而是腳本,這就象是浏覽器執行JS腳本一樣了。不過這個腳本是行業相關的,功能可以更加強大,這更新當然就更容易了。眼前我正在試圖拓展腳本,希望能友善地應用于普通的小程式。呵呵

Q:更新會涉及到系統資料庫的變化等等,并非單純的拷貝更新。

對于,shell.exe,其啟動的時機是什麼呢?如何自啟動呢?

A:“更新會涉及到系統資料庫的變化等等,并非單純的拷貝更新。 ”如果更新會因為系統資料庫的問題而造成困惑,那麼一定設計上是非常不合理的了,你得多考慮一下設計上的問題。更新考慮更多的應該三方面,一是各子產品的版本資訊判斷問題,二是各子產品的下載下傳問題,三就是覆寫問題。而這三方面,最後的一個問題最重要了,因為有可能因為種種原因而隻能成功覆寫部份子產品,這可能就得有版本復原或其它的補救方案。具體應用中怎麼處理,就看項目的性質和公司的習慣了。

“對于,shell.exe,其啟動的時機是什麼呢?如何自啟動呢?”,我已說得很明白了,這個shell.exe其實就是一個入口,當然就是最初的時候運作了。這個程式就是先判斷是不是要更新真正的應用系統(如果要就先更新),然後再啟動真正的業務應用系統。

Q:多謝bluebee2009回複,現在有個問題:你在回複中提到“額外寫一個AutoCopy.DLL檔案,在工作系統退出的時候,通過rundll32.exe來調用我的AutoCopy.dll”,這個“在工作系統退出的時候,通過rundll32.exe來調用我的AutoCopy.dll”如何實作的?我vc不是太好,多謝指教!

A:你查一下rundll32.exe相關的資料就知道了。

版權聲明:本文為CSDN部落客「weixin_34319999」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_34319999/article/details/91872280