Installation 如何确保在使用/COMPONENTSONLYONCUSTOM时取消选择所有组件?

Installation 如何确保在使用/COMPONENTSONLYONCUSTOM时取消选择所有组件?,installation,nsis,Installation,Nsis,我有以下NSIS安装类型: InstType“X(推荐)” InstType“/CUSTOMSTRING=Y(高级模式)” 仪表类型/部件自定义 其思想是,安装“X”应以静默方式安装所有组件,而安装“Y”应仅安装已选择的组件。默认情况下,应取消选择安装“Y”的所有组件。这是我无法实现的 我尝试了很多不同的场景来取消选择安装“Y”的所有组件,但由于某些原因,NSIS总是将选择“X”作为“Y”的默认值。由于已为“X”选择了所有组件,因此默认情况下,安装“Y”将选择所有组件 如何确保在此场景中默认取消

我有以下NSIS安装类型:

InstType“X(推荐)”
InstType“/CUSTOMSTRING=Y(高级模式)”
仪表类型/部件自定义

其思想是,安装“X”应以静默方式安装所有组件,而安装“Y”应仅安装已选择的组件。默认情况下,应取消选择安装“Y”的所有组件。这是我无法实现的

我尝试了很多不同的场景来取消选择安装“Y”的所有组件,但由于某些原因,NSIS总是将选择“X”作为“Y”的默认值。由于已为“X”选择了所有组件,因此默认情况下,安装“Y”将选择所有组件


如何确保在此场景中默认取消选择所有组件安装“Y”?

由于/CUSTOMSTRING InstType是特殊的,因此您可能在这里稍微改变了一些规则,自定义的目的是让用户选择不同的部分,并最终得到与任何预定义InstType不同的内容。它实际上没有默认值,它基于用户选择的上一个InstType(在您的示例中,它始终是X)

!包括LogicLib.nsh
!包括第3.nsh节
!包括WinMessages.nsh
页面组件
页面文件
!定义ITS in_X 1;ID中的节基于1
InstType“X(推荐)”
InstType“/CUSTOMSTRING=Y(高级模式)”;“特殊”自定义类型
仪表类型/部件自定义
“A”节SID_A
第${ITSIN_X}节
详细打印a
分段结束
“B”节SID_B
第${ITSIN_X}节
详细打印b
分段结束
函数onSelChange
/*
无证黑客!
我们将检查当前InstType是否为自定义类型,即使当前节“selection”与另一个InstType匹配(如果可能,GetCurInstType返回非自定义)
*/
FindWindow$9“#32770”“”$HWNDPARENT
FindWindow$9“组合框”“”$9
SendMessage$9${CB_GETCURSEL}0$0
SendMessage$9${CB_GETITEMDATA}$0$0
${If}$0=${NSIS_MAX_INST_TYPES};自定义类型?
${AndIf}$1$0;仅在InstType更改时执行unselect hack(BUGBUG:应该在页面创建/显示回调中将$1设置为某个值)
!如果1;如果您只有几个部分,您可以使用它们的ID
!insertmacro取消选择节${SID_A}
!insertmacro取消选择节${SID_B}
!其他的如果你很懒,也可以使用循环
StrCpy$20
明显错误
循环:
SectionGetFlags$2$3
错误端
!insertmacro取消选择节$2;如果需要跳过此处的隐藏部分,可以选中SectionGetText
输入$2$2+1
转到环路
完:
!恩迪夫
${EndIf}
StrCpy$1$0;保存当前的InstType,以便我们知道它是否更改
功能端

回答得很好。这正是我想要的。
!include LogicLib.nsh
!include Sections.nsh
!include WinMessages.nsh

Page Components
Page InstFiles

!define ITSIN_X 1 ; SectionIn ID's are 1 based
InstType "X (recommended)"
InstType "/CUSTOMSTRING=Y (advanced mode)" ; The "special" custom InstType
InstType /COMPONENTSONLYONCUSTOM

Section "A" SID_A
SectionIn ${ITSIN_X}
DetailPrint a
SectionEnd

Section "B" SID_B
SectionIn ${ITSIN_X}
DetailPrint b
SectionEnd

Function .onSelChange
/*
UNDOCUMENTED HACK!
We are going to check if the current InstType is the custom type even if the current section "selection" matches another InstType (GetCurInstType returns non-custom if possible)
*/
FindWindow $9 "#32770" "" $HWNDPARENT
FindWindow $9 "ComboBox" "" $9
SendMessage $9 ${CB_GETCURSEL} 0 0 $0
SendMessage $9 ${CB_GETITEMDATA} $0 0 $0
${If} $0 = ${NSIS_MAX_INST_TYPES} ; The custom InstType?
${AndIf} $1 <> $0 ; Only do the unselect hack on InstType changes (BUGBUG: Should really set $1 to something in the page create/show callback)
!if 1 ; If you only have a few sections you can just use their ID
    !insertmacro UnselectSection ${SID_A}
    !insertmacro UnselectSection ${SID_B}
!else ; ...or use a loop if you are lazy
    StrCpy $2 0
    ClearErrors
    loop:
        SectionGetFlags $2 $3
        IfErrors end
        !insertmacro UnselectSection $2 ; You could check SectionGetText if you need to skip hidden sections here
        IntOp $2 $2 + 1
        Goto loop
    end:
!endif
${EndIf}
StrCpy $1 $0 ; Save the current InstType so we can tell if it changes
FunctionEnd