Installshield 2014 Basic MSI隐藏功能,动态不安装功能

时间:2014-11-20 18:11:06

标签: basic-msi installshield-2014

我使用InstallShield 2014为服务器/客户端程序创建了一个基本MSI安装程序,并且必须根据安装我们的服务器应用程序之前安装的数据库的许可证密钥动态隐藏功能。我已经为需要隐藏的功能创建了条件,如果未获得许可,则将InstallLevel设置为0,如果获得许可,则将其设置为1。我在SQL登录对话框之后获取许可证密钥(因为安装程序不知道要查看的数据库),但是在创建对话框之前运行的CostFinalize操作期间评估条件。因此,在获取许可证密钥并运行其他一些自定义操作以确定每个功能的可用性后,我会在显示CustomSetup对话框之前调用CostFinalize操作。

我正在获取需要显示的功能的正确行为,您可以在对话框中选择或取消选择所述功能,但是,在安装执行时,未安装所选功能....和日志file表示即使用户明确选择了该功能,也不会选择安装该功能。为什么会这样?是否有另一种动态隐藏功能的方法(我在InstallScript操作中尝试过FeatureSetData函数,但无济于事)?

此外,在我向功能添加条件后,每当我尝试从“程序和功能”应用程序卸载程序时,我都会收到错误1606无法访问网络位置。它就像注册表项在功能上有条件时搞砸了......任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:2)

我发现了问题...如果你将InstallLevel的功能设置为0并且具有将其设置为大于零的条件,那么无论是否选择了该功能,它都不会安装该功能。如果您反转此逻辑并以InstallLevel设置为1的功能开始并且具有将installlevel更改为0的条件,则它将隐藏或显示该功能并且将正确安装。这也导致错误1606我在卸载...

此外,如果有人安装了不应安装的组件,那么您可以尝试将依赖关系检查切换为无。出于某种原因,InstallShield执行的.NET依赖性检查会导致某些组件一直安装,即使它们已分配的功能已关闭。希望这可以帮助将来的某个人。

答案 1 :(得分:0)

CostFinalize也可以通过对话框运行以刷新功能列表。以下是步骤: 在SetupType对话框的Next PushButton中,在顶部创建一个新项目。

事件:DoAction

参数:CostFinalize

条件:1 = 1

就我而言,我隐藏了一个基于之前对话框的功能,需要它重新评估程序功能中的条件。 条件:等级:0 GLOBAL_VAR = 0 条件:等级:1 GLOBAL_VAR = 1