軟件的升級及卸載原理

軟件在安裝時,到底作了些什麼? 你們天天都在用電腦,可能也常常在本身的電腦上安裝軟件。就算本身沒安裝過,至少也看到人家安裝過軟件。在這裏,我不是想教你怎麼安裝軟件,而是想向你展現,軟件在安裝的過程當中,到底都作了些什麼動做?爲何有些軟件要安裝,直接拷貝過去卻不能用?爲何一些軟件安裝或卸載以後要重啓。下面要討論的就是這些問題。
首先,咱們探討一下軟件安裝的共通部分,說共通,就是在不一樣版本的操做系統上,如WINDOWS98,WIN2K和WINXP等上它們都有共同點的地方。這個文章也試圖不針對具體的某個操做系統,而對共同的規律來探討,不過我本身用的是WINDOWS98,因此有時一些例子可能會用WINDOWS98上的實例來講明,而大多數狀況下這些特*在WIN2K和WINXP上也是相似的。
那麼,我先來概括一下,典型的軟件安裝過程都有可能作哪些事情。因爲咱們是討論軟件在安裝時的行爲,因此開始安裝前的設置和選項咱們就暫不討論,只說到軟件真正開始安裝那個時候起的動做:
①文件從安裝源位置拷貝到目標位置。
②往系統目錄寫入一些必要的動態鏈接庫(DLL)。(可選)
③往系統註冊表中寫入相應的設置項。(可選)
④創建開始菜單裏的程序組和桌面快捷方式。(可選)
⑤其餘動做。(可選)
下面咱們再詳細來分析上面概括出來的這些動做:
1)拷貝軟件自己須要的文件。源位置指軟件未安裝以前的位置,例如光盤,下載的目錄等,目標位置指你指定的安裝位置。
這是幾乎全部的軟件安裝過程必定會作的一件事。而若是一個軟件,在安裝時只要這一步,不須要後面的其餘幾步,咱們能夠認爲這個軟件就是綠色軟件。或者反過來講綠色軟件就是隻要拷貝文件,不須要依賴於某個DLL,或者它依賴的DLL在幾乎全部的系統中都必定有的,而且它也不依賴於註冊表裏面的設置項的軟件。
2)這一步,能夠說至少有一半軟件在安裝時都會作,一些軟件,須要用到某個DLL,特別是那些軟件做者開發的DLL,或者系統中不經常使用的DLL,通常都會隨軟件的安裝拷到系統目錄。所謂系統目錄,在WIN98下通常是在WINDOWS\SYSTEM這個目錄,而WIN2K是在WINNT\SYSTEM32,WINXP是在WINDOWS\SYSTEM32。還有,一些軟件如QQ遊戲,中游等,它們也用到一些DLL,因爲這些DLL只是這個軟件本身用到,別的其餘軟件不會用到,因此它們並不必定存在於系統目錄,而是放在軟件安裝目錄裏面,這樣的DLL已經在上一步中被拷貝,因此和這一步說的狀況不同。
3)這一步一樣至少有一半軟件會作,通常在安裝前用戶的設置和一些選項,在安裝時就會把這些設置寫到註冊表裏。另外就是有時在上一步把DLL拷貝到系統目錄時,一些DLL須要向系統註冊,這些DLL的註冊信息也會寫在註冊表裏。還有,一些軟件有時可能安裝時並不寫註冊表,而是在第一次運行時才把一些設置寫到註冊表。也有把設置寫進INI文件的
4)這個很是簡單,大概不須要怎麼解釋。創建這些快捷方式一方面是便於用戶執行,另外在時也會把卸載的快捷方式放在程序組裏。關於卸載後面咱們再來討論。
5)這個就是除了上面說的之外的其餘狀況。例若有些軟件安裝時會先把全部文件(或一部分文件)先解壓到臨時目錄,那麼安裝完以後就要把這些文件刪除掉。
那麼咱們再總結一下:
1、一個典型的軟件在安裝過程通常都會執行上面的1-4項。這樣能夠認爲是一個完整的安裝過程。
2、除了第1項以外,其餘的都不是必要的。只須要第一項的軟件,咱們能夠把它叫作綠色軟件。
3、有些軟件安裝時是執行了一、二、4,有些軟件是執行了一、三、4,有些軟件是執行了一、4。
4、一個特殊的狀況,通常的驅動程序,只會執行2和3,沒有1和4。
5、理論上,任何軟件,若是你很是確切地知道了它在上面的那幾步都具體作了些什麼,特別是2和3,那麼,理論上你能夠把這個軟件的安裝文件拷貝到另外一臺機子,把必要的DLL從系統目錄拷貝到那一臺機子的系統目錄,再把註冊表裏軟件寫入的項目導出來(必要時還要修改一下)再導入到那臺機子的註冊表中,那麼,就算不是綠色軟件,你也能這樣把它移植給另外一臺機。但有時特別是一些共享軟件,通常都會有註冊表中設置比較隱蔽的項目,不容易查找,因此除非你對系統很是熟悉,不然不是綠色軟件的軟件要移植仍是有必定的難度的。
那麼,下面咱們再來看看,爲何一些軟件安裝後要重啓。
在WINDOWS操做系統上,通常一個正在運行中的程序,操做系統是不讓你修改它的,修改包括替換,改動和刪除。那麼有時,一些軟件須要向系統目錄中寫入一個DLL,而系統目錄中原來已經有同名的DLL而且這個DLL目前正在被系統使用,所以不能用新版本去替換它,這個時候就須要重啓,在重啓的過程當中,在這個DLL舊的版本被使用以前用新版本替換它。這就是爲何要重啓的緣由。
你能看到這裏,說明你頗有耐心,而且對技術的探討頗有興趣,那麼我就再說得更詳細些。在WIN98中,上面說的這個替換是由系統的一個工具來實現的,這個工具叫WININIT.EXE。安裝程序在檢測到須要寫入的DLL或其餘程序文件正在使用時,會把要寫入的DLL文件先定一個臨時的文件名,而後在WINDOWS目錄中往WININIT.INI寫入一個改寫項,好比,一個叫ABCD.DLL的動態鏈接庫如今正在使用中,而安裝程序要往系統中寫入新版本的ABCD.DLL,這時安裝程序會把新版本ABCD.DLL先定一個臨時文件名,例如AAAA.LLL,而後在WININIT.INI中的[rename]一節中寫入這一項: ?篩l罉枓犮
C:\windows\system\abcd.dll=C:\windows\system\aaaa.lll CX = B )
這樣,在重啓時,進入WINDOWS圖形界面以前,WININIT.EXE在檢測到WINDOWS目錄中有WININIT.INI存在時,就執行裏面的操做,在上面的例子中,是用C:\windows\system\aaaa.lll去替換掉C:\windows\system\abcd.dll這個文件,而且把WININIT.INI更名爲WININIT.BAK。
另外,有些軟件,在安裝時,是把全部文件包括SETUP.EXE解壓到臨時文件裏面再執行SETUP.EXE進行安裝的,按理來講安裝完要把全部的臨時文件刪除掉,這個操做固然也是由安裝程序SETUP.EXE來完成,但它本身正在運行,也刪不了它本身,因此也要重啓來刪除,作法和上面差很少,只是改爲相似這樣子的: 怦S?vH燁?
NUL=C:\WINDOWS\TEMP\SETUP.EXE
在WIN2K和WINXP中,存在相似的機制,不過並非用WININIT.EXE和WININIT.INI來實現,具體的作法我也不是很清楚,長期以來我大多數時候都是在用WIN98,因此沒認真研究過,但軟件安裝過程要重啓的現象在2K和XP上是仍然存在的,原理也是在重啓時替換或修改正在使用的文件,只是實現的方式不一樣。
最後,咱們再來看看有關卸載方面的內容。通常卸載有好幾種方式:
1)早期的安裝程序,通常會在安裝過程記錄了上面說的安裝過程的1234四個步驟中具體拷貝的文件和DLL以及註冊表項,把它保存在INSTALL.LOG之類的文件中,再在軟件的安裝目錄(或WINDOWS目錄中)放一個UNINST.EXE之類的卸載程序。而後要麼在程序組裏爲這個UNINST.EXE建一個快捷方式,要麼在註冊表中爲這個UNINST.EXE建一個快捷方式(這 誑刂潑姘宓奶砑由境 絛蚓湍芸吹餃砑 男對叵?,並把INSTALL.LOG作爲它的參數,這樣就實現卸載了。
2)如今比較多的安裝程序是用新版的INSTALLSHIELD生成的,安裝時的記錄和卸載程序通常是會放在C:\Program Files\InstallShield Installation Information這個文件夾(隱藏屬*)裏,一樣也會在程序組和註冊表中創建卸載項。
另外,在卸載時,也會遇到文件(通常是DLL文件)正在使用的狀況。因此有時卸載的時候也要重啓,就是要在重啓過程當中刪掉這些正在使用的DLL文件。windows

[轉自]http://blog.163.com/wumingxiaobao@126/blog/static/1694620212011101110582432/markdown

相關文章
相關標籤/搜索