2012-06-21 3 views
0

Я хочу, чтобы установщик/деинсталлятор проверял, установлен ли какой-либо из возможных компонентов, и отображать только релевантные компоненты (установщик должен отображать только компоненты, которые еще не установлены, а деинсталлятор должен отображать только уже установленные компоненты)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 и используете макросы SelectSection и UnselectSection.

Если вы хотите, чтобы скрыть раздел, нужно просто установить его текст «» (пустую строку)

SectionSetText ${test_section_id} "" 
+0

Спасибо, это работало большое :) –

0

Вы изменяете неправильный текст. MUI_DESCRIPTION_TEXT - это длинное описание, которое обычно отображается при наведении указателя мыши на компонент. Но видимость раздела зависит от его имя пусто или пусто.

Поэтому вы должны использовать это вместо того, чтобы скрыть свой Component1:

SectionSetText ${Component1} "" 
Смежные вопросы