@ledsun blog

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

WiXでショートカットをつくるときにレジストリ値が要らない方法

WiXではショートカットを作る方法が2つあります。

WiX チュートリアル 日本語訳 Lesson 1 始めよう / 2. 中に入るファイル では、次のような方法を紹介しています。

<Component Id='MainExecutable' Guid='YOURGUID-83F1-4F22-985B-FDB3C8ABD471'>
  <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" />
</Component>

1つのComponentの中に、FileとShortcutをまとめて書きます。

では、違う方法を紹介しています。

<DirectoryRef Id="MyShortcutsDir">
  <Component Id="CMP_DocumentationShortcut" Guid="xxxx">
    <Shortcut Id="DocumentationStartMenuShortcut"
              Name="Awesome Software Documentation"
              Targte="[MyProgramDir]InstallMe.txt" />
    <RegistryValue Root="HKCU"
                    Key="Software\Microsorft\AwsomeSoftware"
                    Name="installed"
                    Type="integer"
                    Value="1"
                    KeyPath="yes" />
  </Component>
</DirectoryRef>

大きな違いはレジストリに値を登録するかどうかです。 説明によると、コンポーネントにはインストール済みかどうかを判定するためにKeyPathという要素が必要だそうです。 FileはKeyPathになれます。ShortcutはKeyPathになれません。 なぜ、ShortcutがKeyPathに、なれないのかはわかりません。 そこで、代わりにレジストリに値を登録して、KeyPathとします。

しかし、 WiXでWSLポートフォワード設定するインストーラーを作る - @ledsun blog でやったように「アドバタイズされたショートカット」でないと、 Fileと同一のComponent内で定義しても、レジストリに値を登録する必要があります。 これもなぜなのかわかりません。

最初はチュートリアルのFileと一緒に書いて別ディレクトリにショートカットを作成するのが、気持ち悪く感じました。 そのため本の方法が良さそうだと思っていました。 ただ、レジストリに値を登録するのはもっと嫌です。 10年くらい前のWindowsユーザとしてのレジストリが汚れて手の施しようがなくなった大変だった経験から、レジストリに値を追加するのに忌避感があります。 チュートリアルのやり方の方が良さそうだと感じています。