共用方式為


使用版本資訊

安裝程式通常具有下列目標:

  • 將檔案放在正確的位置。
  • 若要通知使用者安裝程式是否以明顯不同的版本取代現有的檔案,例如,以英文檔案取代德文語言檔案,或使用較舊的檔案取代較新的檔案。

撰寫安裝程式時,您必須為每個檔案提供下列資訊:

  • 檔案的名稱和位置 (稱為原始程式檔) 。
  • 使用者硬碟上對等檔案的名稱, (稱為目的地檔案) 。 此名稱通常與安裝磁片上的檔案名相同。
  • 檔案的共用狀態,也就是檔案是安裝的應用程式私用,還是可由多個應用程式共用。

安裝程式可以使用 VerFindFile 函式來判斷檔案應該在磁片上複製的位置。 此函式也可用來指定檔案是應用程式的私人檔案,還是可以共用。 如果尋找檔案時發生問題, VerFindFile 會傳回錯誤值。 例如,如果系統使用目的地檔案, VerFindFile傳回VFF_FILEINUSE。 安裝程式必須通知使用者問題,並回應使用者決定繼續或結束安裝。

VerInstallFile函式會將原始程式檔複製到VerFindFile所指定目錄中的暫存檔案。 如有必要, VerInstallFile 會使用資料解壓縮程式庫中的函式來擴充檔案。

VerInstallFile 會將暫存檔案的版本資訊與目的地檔案的版本資訊進行比較。 如果兩者不同, VerInstallFile 會 傳回一或多個錯誤值。 例如,如果暫存檔案比目的地檔案舊,則會傳回 VIF_SRCOLD ,如果檔案有不同的語言識別項或字碼頁值,則會 傳回VIF_DIFFLANG 。 安裝程式必須通知使用者問題,並回應使用者決定繼續或結束安裝。

某些 VerInstallFile 錯誤是可復原的。 也就是說,安裝程式可以再次呼叫 VerInstallFile ,並指定 VIFF_FORCEINSTALL 選項來安裝檔案,而不論版本衝突為何。 如果 VerInstallFile 傳回 VIF_TEMPFILE ,而且使用者選擇不強制安裝,安裝程式應該刪除暫存檔案。

嘗試強制安裝時,VerInstallFile可能會遇到無法復原的錯誤,即使先前不存在錯誤也一樣。 例如,在安裝程式嘗試強制安裝之前,其他使用者可能會鎖定檔案。 如果安裝程式嘗試在無法復原的錯誤之後強制安裝, VerInstallFile 會失敗。 安裝程式必須包含常式,才能從這種類型的錯誤中復原。

建議的解決方案是顯示對話方塊,其中包含 [ 安裝]、 [略過] 和 [ 全部安裝]按鈕。 (另一個解決方案是一個對話方塊,其中包含 [是]、[全部]、[略過] 和 [取消]。) [全部安裝] 按鈕應防止安裝程式提示使用者輸入類似錯誤,方法是在VerInstallFile的所有後續使用中包含[VIFF_FORCEINSTALL] 選項。 針對無法復原的錯誤,應該停用 [安裝安裝全部] 按鈕。

若要向使用者顯示有用的錯誤訊息,安裝程式通常必須從衝突檔案的版本資源擷取資訊。 安裝程式可用於此用途的函式有四個:

GetFileVersionInfoSize 會傳回版本資訊的大小。 GetFileVersionInfo 會使用 GetFileVersionInfoSize 所擷取的資訊來擷取包含版本資訊的結構。 VerQueryValue 會從該結構擷取特定成員。

例如,如果 VerInstallFile 傳回 VIF_DIFFTYPE 錯誤,安裝程式應該使用暫存和目的地檔案上的 GetFileVersionInfoSizeGetFileVersionInfoVerQueryValue 函式來取得每個檔案的一般類型。 如果檔案的語言衝突,安裝程式也應該使用 VerLanguageName 將二進位語言識別項翻譯成語言的文字標記法。 (例如,0x040C轉譯為字串 「French」。)

如果 VerInstallFile 傳回檔案錯誤,例如 VIF_ACCESSVIOLATION,安裝程式應該使用 GetLastError 函式來擷取最新的錯誤值。 程式應該將此值轉譯為資訊訊息,向使用者顯示。 程式不得在 呼叫 VerInstallFileGetLastError之間產生控制權。