1

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

我正在使用 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

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

首先,我尝试使用这个宏来检查注册表是否存在:

!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::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”视为可能的组件!

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

提前致谢!

4

2 回答 2

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如果您包含标题并使用SelectSectionandUnselectSection宏,这些会更简单。

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

SectionSetText ${test_section_id} ""
于 2012-06-21T15:43:21.580 回答
0

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

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

SectionSetText ${Component1} ""
于 2012-06-21T19:31:21.983 回答