MSI:仅在未安装其他组件的情况下如何安装组件

时间:2011-04-29 19:46:42

标签: windows-installer conditional-statements installshield-2011

我的应用程序涉及一个带有快捷方式的可选组件,该组件取代了默认安装提供的快捷方式。如果未安装此可选附件,我无法弄清楚如何只安装默认快捷方式 - 或者我只需要给它们两个相同的名称并希望最好?这需要通过自定义安装树以及常规按钮来完成。

查看它的工作方式是,如果在安装时选择了这个额外的选项,主应用程序的“开始菜单”快捷方式必须改为指向此应用程序,这将在需要时自行打开主要应用程序。

我正在使用InstallShield 2011 Professional。

编辑: 澄清 - 我确实将它作为三个组件:main,main的快捷方式和带快捷方式的插件。我只是不知道如何检查插件是否已安装/我可以将其置于main的快捷方式。当然有一个变量吗?文档非常简洁。

3 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,MAIN.EXE会获得一个快捷方式,除非安装了MIDDLEMAN.EXE。在这种情况下,MIDDLEMAN.EXE获取快捷方式。

这是一个奇怪的问题,因为组件的存在会改变另一个组件的定义。不过,它可以做到。我这样做的方法是为MIDDLEMAN.EXE创建一个组件并定义它的快捷方式。为MAIN.EXE创建另一个组件,不要定义它的快捷方式。

然后编写一个在执行序列中运行的自定义操作,该操作在文件成本核算后运行。检查MIDDLEMAN.EXE是否未安装且未安装。如果是这样,请在ShortCut表中写一个临时行来定义MAIN.EXE的ShortCut。

从那里你可以让MSI处理其余部分,而不需要延迟的自定义操作来处理快捷方式的服务。

不过,我不禁想知道是否通过改变应用程序的设计不能简化这一点。基本上你试图在EXE级别进行依赖注入,并且在DLL级别更容易实现。换句话说:

使用ShortCut进行MAIN.EXE 可选的DLL

始终调用MAIN.EXE,但当Optional.DLL存在时,他的行为会有所不同。

答案 1 :(得分:0)

假设安装中包含默认组件,您可以使用“额外”组件的组件条件。然后,您可以确保仅在其他组件未安装时才安装此额外组件,即它们变得互斥。这将避免任何混乱的功能,使您的自定义对话框更复杂。

答案 2 :(得分:0)

@Stephen:我看不出如何避免使用功能,因为GUI中只有用户可以看到功能,因此允许用户指定要安装的内容?

我通常不喜欢这种解决方案,因为它不会根据MSI文件的内部一致性检查器进行验证,但是您可以将EXE安装在一个组件中,然后有两个组件,每个组件都有不同的快捷方式相互排斥。然后,将自定义快捷方式组件附加到要触发要安装的自定义快捷方式的功能部件。必须在GUI中设置该功能。快捷方式必须是非广告的,因为它们位于没有文件的组件中。您可能需要在快捷方式组件上设置瞬态标志,以允许删除/添加正确的组件以进行维护安装。瞬态组件在维护安装期间重新评估其组件条件,以检查为其指定的条件是否会触发删除/添加。