0

次の NSIS インストール タイプがあります。

InstType "X (推奨)"
InstType "/CUSTOMSTRING=Y (詳細モード)"
InstType /COMPONENTSONLYONCUSTOM

インストール "X" はすべてのコンポーネントをサイレント インストールし、インストール "Y" は選択されたコンポーネントのみをインストールするという考え方です。インストール「Y」のコンポーネントは、デフォルトですべて選択解除されているはずです。これは私が達成することができないものです。

インストール「Y」のすべてのコンポーネントを選択解除するために、さまざまなシナリオを試しましたが、何らかの理由で、NSIS は常に「X」を「Y」のデフォルトとして選択します。「X」ですべてのコンポーネントが選択されているため、インストール「Y」ではデフォルトですべてのコンポーネントが選択されます。

このシナリオでは、すべてのコンポーネントのインストール「Y」がデフォルトで選択解除されていることを確認するにはどうすればよいですか?

4

1 に答える 1

2

/CUSTOMSTRING InstType は特殊なので、ここでルールを少し曲げている可能性があります。カスタムのポイントは、ユーザーがセクションを選んで、定義済みの InstTypes とは異なるものになるようにすることです。実際にはデフォルトはありません。ユーザーが選択した以前の InstType に基づいています (この場合、常に X です)。

!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
于 2013-10-19T02:55:51.017 に答える