NSIS - 有条件地显示组件

时间:2012-06-21 14:58:44

标签: nsis

我希望安装程序/卸载程序检查是否安装了任何可能的组件,并仅显示相关组件(安装程序应仅显示尚未安装的组件,卸载程序应仅显示已安装的组件)

我正在使用MUI。

我的.nsi的组件部分看起来像这样:

; Section descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
    !insertmacro MUI_DESCRIPTION_TEXT ${Component1} "Component1 Description"
    !insertmacro MUI_DESCRIPTION_TEXT ${Component2} "Component2 Description."
    !insertmacro MUI_DESCRIPTION_TEXT ${Component3} "Component3 Description."
!insertmacro MUI_FUNCTION_DESCRIPTION_END

我尝试了几种不同的方式:

首先,我尝试使用this macro检查注册表是否存在:

!insertmacro IfKeyExists HKEY_LOCAL_MACHINE SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall "Component1"
Pop $R0
${If} $R0 == 0 #Not installed yet. Display.
    !insertmacro MUI_DESCRIPTION_TEXT ${Component1} "Component1"
${EndIf}

这不起作用。

然后我尝试使用Registry Plug-In

${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Component1" $R0
${If} $R0 == 0 #Not installed yet. Display.
    !insertmacro MUI_DESCRIPTION_TEXT ${Component1} "Component1"
${EndIf}

这也不起作用。

那么我想也许还有一些其他更基本的问题,我试过这个:

StrCpy $0 "0"
${If} $0 == "1"
    !insertmacro MUI_DESCRIPTION_TEXT ${Component1} "Component1 Description."
${EndIf}

但即便如此,我仍然在安装过程中看到“Component1”作为可能的组件!

我做错了什么,如何实现目标?

提前致谢!

2 个答案:

答案 0 :(得分:3)

要在运行时选择一个部分(=一个组件),您可以使用SectionGetFlag / SectionSetFlag和一些位操作:

SectionGetFlags ${test_section_id} $0
IntOp $0 $0 | ${SF_SELECTED}
SectionSetFlags ${test_section_id} $0

要取消选择它,只需使用

将其选定的位设为
SectionGetFlags ${test_section_id} $0
IntOp $0 $0 ^ ${SF_SELECTED}
SectionSetFlags ${test_section_id} $0

如果您添加Sections.nsh标头并使用SelectSectionUnselectSection宏,则会更简单。

如果要隐藏某个部分,只需将其文本设置为“”(空字符串)

即可
SectionSetText ${test_section_id} ""

答案 1 :(得分:0)

您正在修改错误的文字。 MUI_DESCRIPTION_TEXT是将鼠标悬停在组件上时通常显示的长描述。但是部分的可见性取决于其名称是空的还是非空的。

因此,你必须使用它来隐藏你的component1:

SectionSetText ${Component1} ""