1

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

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

此外,在将条件添加到功能后,每当我尝试从“程序和功能”应用程序中卸载该程序时,都会收到错误 1606 无法访问网络位置。当功能存在条件时,就像注册表项被弄乱了......任何帮助将不胜感激。

4

2 回答 2

2

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

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

于 2014-11-21T14:19:02.907 回答
0

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

事件:DoAction

参数:CostFinalize

条件:1=1

在我的例子中,我隐藏了一个基于前一个对话框的功能,并且需要它来重新评估程序功能中的条件。条件:级别:0 GLOBAL_VAR=0 条件:级别:1 GLOBAL_VAR=1

于 2015-10-02T17:22:39.120 回答