使用版本資訊
安裝程式通常有下列目標:
- 將檔案放在正確的位置。
- 若要通知使用者,如果安裝程式以明顯不同的版本取代現有的檔案,例如,以英文檔案取代德文檔案,或以較舊的檔案取代較新的檔案。
撰寫安裝程式時,您必須為每個檔案提供下列資訊:
- 檔案的名稱和位置(稱為原始程序檔)。
- 使用者硬碟上對等檔案的名稱(稱為目的地檔案)。 此名稱通常與安裝磁碟上的檔名相同。
- 檔案的共享狀態,也就是檔案是安裝的應用程式私用,還是可由多個應用程序共用。
安裝程式可以使用 VerFindFile 函式來判斷檔案應在磁碟上複製的位置。 此函式也可以用來指定檔案是否為應用程式私用或可共用。 如果找到檔案時發生問題,VerFindFile 會傳回錯誤值。 例如,如果系統使用目的地檔案,VerFindFile 會傳回 VFF_FILEINUSE。 安裝程式必須通知用戶問題,並回應使用者決定繼續或結束安裝。
VerInstallFile 函式會將來源檔案複製到 VerFindFile 所指定目錄中的臨時檔,。 如有必要,VerInstallFile 使用數據解壓縮連結庫中的函式展開檔案。
VerInstallFile 比較暫存盤的版本資訊與目的地檔案的版本資訊。 如果兩者不同,VerInstallFile 會傳回一或多個錯誤值。 例如,如果暫存盤早於目的地檔案,而且如果檔案有不同的語言標識碼頁值,則會傳回 VIF_SRCOLDVIF_DIFFLANG。 安裝程式必須通知用戶問題,並回應使用者決定繼續或結束安裝。
有些 VerInstallFile 錯誤是可復原的。 也就是說,安裝程式可以再次呼叫 VerInstallFile,並指定 VIFF_FORCEINSTALL 選項來安裝檔案,而不論版本衝突為何。 如果 VerInstallFile 傳回 VIF_TEMPFILE,且使用者選擇不強制安裝,安裝程式應該刪除暫存盤。
VerInstallFile 嘗試強制安裝時可能會發生無法復原的錯誤,即使先前沒有錯誤也一樣。 例如,在安裝程式嘗試強制安裝之前,其他使用者可以鎖定檔案。 如果安裝程式嘗試在無法復原的錯誤之後強制安裝,VerInstallFile 失敗。 安裝程式必須包含從這類錯誤復原的例程。
建議的解決方案是顯示一個對話框,其中包含按鈕 [安裝 ]、[略過 ] 和 [安裝所有 ]。 (另一個解決方案是一個對話框,其中按鈕有 [是]、[全部接受]、[略過]、[取消]。[安裝全部] 按鈕應該防止安裝程式提示使用者出現類似錯誤,方法是在後續所有 VerInstallFile中使用 [VIFF_FORCEINSTALL] 選項。 針對無法復原的錯誤,應該停用 [安裝] 和 [安裝所有] 按鈕。
若要向用戶顯示有用的錯誤訊息,安裝程式通常必須從衝突檔案的版本資源擷取資訊。 安裝程式可用於此用途的函式有四個:
GetFileVersionInfoSize 會傳回版本資訊的大小。 GetFileVersionInfo 會使用 getFileVersionInfoSize 擷取包含版本信息的結構。 VerQueryValue 從該結構擷取特定成員。
例如,如果 VerInstallFile 傳回 VIF_DIFFTYPE 錯誤,安裝程式應該使用 GetFileVersionInfoSize、GetFileVersionInfo,以及 VerQueryValue 暫存和目的地檔案上的函式,以取得每個檔案的一般類型。 如果檔案的語言衝突,安裝程式也應該使用 VerLanguageName,將二進位語言標識符翻譯成語言的文字表示法。 (例如,0x040C轉譯為字串 “French”。)
如果 VerInstallFile 傳回檔案錯誤,例如 VIF_ACCESSVIOLATION,安裝程式應該使用 getLastError 函式來擷取最新的錯誤值。 程序應該將此值轉譯成資訊訊息,向用戶顯示。 程式不得在 呼叫 VerInstallFile 和 GetLastError之間轉移控制權。