我希望安装程序/卸载程序检查是否安装了任何可能的组件,并仅显示相关组件(安装程序应仅显示尚未安装的组件,卸载程序应仅显示已安装的组件)
我正在使用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”作为可能的组件!
我做错了什么,如何实现目标?
提前致谢!
答案 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
标头并使用SelectSection
和UnselectSection
宏,则会更简单。
如果要隐藏某个部分,只需将其文本设置为“”(空字符串)
即可SectionSetText ${test_section_id} ""
答案 1 :(得分:0)
您正在修改错误的文字。 MUI_DESCRIPTION_TEXT是将鼠标悬停在组件上时通常显示的长描述。但是部分的可见性取决于其名称是空的还是非空的。
因此,你必须使用它来隐藏你的component1:
SectionSetText ${Component1} ""