原文地址:http://my.oschina.net/ypimgt/blog/183988
這個非常簡單,把新程序打包放到你的服務器上,外加一個配置說明文件(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相關的資料就知道了。