1. 程式人生 > >軟體安裝過程解析

軟體安裝過程解析

軟體在安裝時,到底做了些什麼? 大家每天都在用電腦,可能也經常在自己的電腦上安裝軟體。就算自己沒安裝過,至少也看到人家安裝過軟體。在這裡,我不是想教你怎麼安裝軟體,而是想向你展示,軟體在安裝的過程中,到底都做了些什麼動作?為什麼有些軟體要安裝,直接拷貝過去卻不能用?為什麼一些軟體安裝或解除安裝之後要重啟。下面要討論的就是這些問題。 

首先,我們探討一下軟體安裝的共通部分,說共通,就是在不同版本的作業系統上,如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的註冊資訊也會寫在登錄檔裡。還有,一些軟體有時可能安裝時並不寫登錄檔,而是在第一次執行時才把一些設定寫到登錄檔。 

4)這個非常簡單,大概不需要怎麼解釋。建立這些快捷方式一方面是便於使用者執行,另外在時也會把解除安裝的快捷方式放在程式組裡。關於解除安裝後面我們再來討論。 

5)這個就是除了上面說的以外的其他情況。例如有些軟體安裝時會先把所有檔案(或一部分檔案)先解壓到臨時目錄,那麼安裝完之後就要把這些檔案刪除掉。 

那麼我們再總結一下: 

一、一個典型的軟體在安裝過程一般都會執行上面的1-4項。這樣可以認為是一個完整的安裝過程。 

二、除了第1項之外,其他的都不是必要的。只需要第一項的軟體,我們可以把它叫做綠色軟體。 

三、有些軟體安裝時是執行了1、2、4,有些軟體是執行了1、3、4,有些軟體是執行了1、4。 

四、一個特殊的情況,一般的驅動程式,只會執行2和3,沒有1和4。 

五、理論上,任何軟體,如果你非常確切地知道了它在上面的那幾步都具體做了些什麼,特別是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]一節中寫入這一項: 竘罉枓犮 
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檔案。