2012-06-21 65 views
0

我想安装/卸载,以检查是否有任何可能的组件的安装,并只显示relevan组件(安装程序将只显示部件尚未安装和卸载程序应该只显示已安装的组件)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

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

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

要取消选择它,只是的toogle其选择的位,用

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

如果包括Sections.nsh头,并使用SelectSectionUnselectSection宏这些都是简单的。

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

SectionSetText ${test_section_id} "" 
+0

谢谢,这真是棒极了:) –

0

要修改的错误文本。 MUI_DESCRIPTION_TEXT是将鼠标悬停在组件上时通常显示的长描述。但部分的可见性取决于其为空或不为空。

因此,你必须使用这个,而不是隐藏你的COMPONENT1:

SectionSetText ${Component1} ""