2014-11-20 105 views
0

我已經創建了一個基本的MSI安裝程序,使用InstallShield 2014作爲服務器/客戶端程序,並且必須根據在我們的服務器之前安裝的數據庫的許可證密鑰動態地隱藏功能應用正在安裝。我爲需要隱藏的功能創建了條件,將InstallLevel設置爲0(如果它們未獲得許可),將InstallLevel設置爲1(如果它們已獲得許可)。我在SQL登錄對話框之後獲取許可證密鑰(因爲安裝程序不知道要查看哪個數據庫),但條件是在創建對話框之前運行的CostFinalize操作期間評估的。因此,在獲取許可證密鑰並運行一些其他自定義操作以確定每個功能的可用性之後,我會在顯示CustomSetup對話框之前調用CostFinalize操作。Installshield 2014 Basic MSI隱藏功能動態不安裝功能

我正在獲取需要顯示的功能的正確行爲,並且您可以在對話框中選擇或取消選擇所述功能,但是,當執行安裝時,所選功能未安裝....並且日誌文件表示該功能未被選中進行安裝,即使用戶明確選擇了該功能。爲什麼會發生這種情況?是否有另一種動態隱藏功能的方法(我在InstallScript操作中嘗試了FeatureSetData函數,但無濟於事)?

此外,在向功能添加條件後,只要我嘗試從程序和功能應用程序中卸載程序,就會收到錯誤1606無法訪問網絡位置。這就像註冊表項變得混亂,當功能的條件...任何幫助將不勝感激。

回答

1

我發現了這個問題......如果您將InstallLevel的功能設置爲0以開始並且有一個條件將其設置爲大於零的條件,那麼無論它是否被選中,它都不會安裝該功能。如果您反轉這一邏輯,並將功能InstallLevel設置爲1開始,並且具有將installlevel更改爲0的條件,則會隱藏或顯示該功能,並且它將被正確安裝。這也造成了錯誤1606我正在卸載...

此外,如果任何人有組件安裝,不應該安裝,那麼你可以嘗試切換依賴檢查爲無。出於某種原因,即使關閉了分配的功能,InstallShield的.NET依賴項檢查也會導致某些組件始終安裝。希望這有助於未來的人。

+0

起初我只是改變了依賴性檢查整個項目,但後來發現它僅適用於'新components',未來組件您我會補充。所以我去了「組件」部分並逐個手動調整每個功能。而令我驚訝的是,它的工作。謝謝,我沒有選擇/想法! – Daneo 2016-01-12 10:16:25

0

CostFinalize也可以通過對話框運行以刷新功能列表。以下是步驟: 在SetupType對話框的Next PushButton中,在頂部創建一個新項目。

事件:DoAction

參數:CostFinalize

條件:1 = 1

在我的情況,我躲在基於以前的對話功能,需要它來重新評估該計劃的條件特徵。 條件:等級:0 GLOBAL_VAR = 0 條件:等級:1個GLOBAL_VAR = 1