@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

メニューフォルダを削除するコンポーネントを節約する

WiX チュートリアル 日本語訳 Lesson 1 始めよう / 3. 使用に供する の SampleFirst.wxs を例にします。

<Component Id='MainExecutable' Guid='A3AAD3C9-C833-4D1B-939E-0D1C47A31D95'>
  <File Id='HogeEXE'
        Name='HogeAppl10.exe' DiskId='1'
        Source='HogeAppl10.exe' KeyPath='yes'>
    <Shortcut Id="startmenuHoge10" Directory="ProgramMenuDir"
              Name="ほげ 1.0" WorkingDirectory='INSTALLDIR'
              Icon="Hoge10.exe" IconIndex="0" Advertise="yes" />
    <Shortcut Id="desktopHoge10" Directory="DesktopFolder"
              Name="ほげ 1.0" WorkingDirectory='INSTALLDIR'
              Icon="Hoge10.exe" IconIndex="0" Advertise="yes" />
  </File>
</Component>

<Directory Id="ProgramMenuFolder" Name="Programs">
  <Directory Id="ProgramMenuDir" Name="ほげ 1.0">
    <Component Id="ProgramMenuDir"
                Guid="B061CD08-398B-47D2-8BAC-B3DA45CCE0D5">
      <RemoveFolder Id='ProgramMenuDir' On='uninstall' />
      <RegistryValue Root='HKCU'
                      Key='Software\[Manufacturer]\[ProductName]'
                      Type='string' Value='' KeyPath='yes' />
    </Component>
  </Directory>
</Directory>

<Component Id='MainExecutable' Guid='A3AAD3C9-C833-4D1B-939E-0D1C47A31D95'>
  <File Id='HogeEXE'
        Name='HogeAppl10.exe' DiskId='1'
        Source='HogeAppl10.exe' KeyPath='yes'>
    <Shortcut Id="startmenuHoge10" Directory="ProgramMenuDir"
              Name="ほげ 1.0" WorkingDirectory='INSTALLDIR'
              Icon="Hoge10.exe" IconIndex="0" Advertise="yes" />
    <Shortcut Id="desktopHoge10" Directory="DesktopFolder"
              Name="ほげ 1.0" WorkingDirectory='INSTALLDIR'
              Icon="Hoge10.exe" IconIndex="0" Advertise="yes" />
  </File>

  <RemoveFolder Id='ProgramMenuDir' On='uninstall' />
</Component>

<Directory Id="ProgramMenuFolder" Name="Programs">
  <Directory Id="ProgramMenuDir" Name="ほげ 1.0"/>
</Directory>

と書き換えるとコンポーネントが1つ節約できます。 RemoveFolderを実行ファイルのコンポーネントに入れてしまいます。

また、

    <Component Id="ProgramMenuDir"
                Guid="B061CD08-398B-47D2-8BAC-B3DA45CCE0D5">
      <RemoveFolder Id='ProgramMenuDir' On='uninstall' />
      <RegistryValue Root='HKCU'
                      Key='Software\[Manufacturer]\[ProductName]'
                      Type='string' Value='' KeyPath='yes' />
    </Component>

は、ファイルを持たないコンポーネントなので、KeyPathになるレジストリキーが必要です。 これも実行ファイルのコンポーネントに入れてしまえば、実行ファイル自体がKeyPathになるので、不要になります。