1

インストーラー/アンインストーラーに、可能なコンポーネントのいずれかがインストールされているかどうかを確認し、関連するコンポーネントのみを表示するようにします(インストーラーは、まだインストールされていないコンポーネントのみを表示し、アンインストーラーは、インストール済みのコンポーネントのみを表示する必要があります)

私は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

私はいくつかの異なる方法を試しました:

まず、レジストリが存在するかどうかを確認するためにこのマクロを使用してみました。

!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::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」が可能なコンポーネントとして表示されました。

私は何を間違っているのですか、そしてどうすれば私の目標を達成することができますか?

前もって感謝します!

4

2 に答える 2

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} ""
于 2012-06-21T15:43:21.580 に答える
0

間違ったテキストを修正しています。MUI_DESCRIPTION_TEXT は、コンポーネントの上にマウスを置いたときに通常表示される長い説明です。ただし、セクションの可視性は、その名前が空であるか空でないかによって異なります。

したがって、代わりにこれを使用して component1 を非表示にする必要があります。

SectionSetText ${Component1} ""
于 2012-06-21T19:31:21.983 に答える