【WiX】ICE43、ICE57、ICE64についてのメモ

Windows Installer XML

: error LGHT0204 : ICE43: Component ▲▲▲ has non-advertised shortcuts. It should use a registry key under HKCU as its KeyPath, not a file.
: error LGHT0204 : ICE57: Component ‘■■■’ has both per-user and per-machine data with a per-machine KeyPath.
: error LGHT0204 : ICE64: The directory ●●● is in the user profile but is not listed in the RemoveFile table.

のようなエラーが発生したのでいろいろ確認してみました。

原因

インストール時にプログラムメニューフォルダーへ配置するショートカットの設定がうまくできていないことが原因でした。下記のような感じで、Fileタグの中にショートカットタグを設定するコンパイルエラーが発生するようです。

<Component Id='WindowsFormsApp1.exe' Guid='【GUID】'>
  <File Id='WindowsFormsApp1.exe' Name='WindowsFormsApp1.exe' Source='App\WindowsFormsApp1.exe'>
    <Shortcut Id="startmenuWindowsFormsApp1.exe" Name="WindowsFormsApp1" Directory="ProgramMenuSubFolder" WorkingDirectory='INSTALLDIR' Icon="WindowsFormsApp1.exe_icon" Advertise="no" />
  </File>
</Component>

解決方法

上記のようなショートカット先のファイルのコンポーネントの中にショートカットタグを設定するのではなく、DirectoryRefタグ等を用いてショートカットの配置先のディレクトリに対し、ショートカットに関する情報を格納するComponentタグを用意すれば解消できました。Componentタグの中には、ShortCutタグ、RemoveFolderタグ、RegistryValueタグを用意しています。

<DirectoryRef Id="ProgramMenuSubFolder">
  <Component Id="ProgramMenuShortcut" Guid="【GUID】">
    <Shortcut Id="ProgramMenuShortcutID" 
          Name="WindowsFormsApp1"
          Target="[INSTALLDIR]WindowsFormsApp1.exe"
          WorkingDirectory="INSTALLDIR"
          Icon="WindowsFormsApp1.exe_icon"
          Advertise="no"
          />
    <RemoveFolder Id="ProgramMenuSubFolderID" On="uninstall"/>
    <RegistryValue Root="HKCU" Key="Software\WindowsFormsApp1" Name="StartMenuShortCut" Type="integer" Value="1" KeyPath="yes"/>
  </Component>
</DirectoryRef>

次に、上記のComponentを下記のようにFeatureの中に参照をさせます

<Feature Id='MainProgram' Title='Program' Description='The main executable.' Level='1'>
  <ComponentRef Id='ProgramMenuShortcut' />
</Feature>

参考サイト

How To: スタートメニューに ショートカットを作成する

以下個人メモ

RemoveFolderタグは、ショートカットを配置するためのサブフォルダーをアンインストールする際に必要になる、空のフォルダーやフォルダーの中にショートカットしか存在しないようなケースでは、RemoveFolderの使用とRegistryValueを使ってレジストリキーへの登録をしなければならないのかもしれない。

実行ファイル等の実体のあるファイルを配置するフォルダーにはRemoveFolderタグだけをつけて、レジストリキーの登録はしないままコンパイルしたところ、コンパイルエラーは起きなかった。

元から存在するフォルダー(プログラムメニュー等)の中に、インストーラーの処理でショートカットしか作らないケースはレジストリ登録だけでよく、RemoveFolderは不要な気がする。

ショートカットの作成に加えて、コンポーネントは 他に2つ 重要なピースを含んでいます。 最初は RemoveFolder エレメントで、これは アプリケーションをアンインストールする時に ApplicationProgramsFolder がスタート メニューから 正しく削除される事を 保証します。 2番目は、Installed で アプリケーションがインストールされている事を示す レジストリー エントリーを作成します。カレント ユーザーの為に アドバタイズドではない ショートカットを インストールする時に ショートカットはコンポーネント用 KeyPath として使う事ができないので、 これが必要です。

http://cml.s10.xrea.com/ej/WiX/create_start_menu_shortcut.htm

↑コンポーネント用 KeyPathっていうのは、コンポーネントがすでにPCの中に存在するかどうかを確認するために使う値っていう意味だと思う。実体のあるファイルとかだとコンポーネントKeyPathっていうものが働き、何も意識しなくてもPC内にコンポーネントがあるか確認できるのかもしれない。ショートカットではそれは使えず、PC内にインストーラーによって作られたショートカットが存在するのか確認するためにレジストリキーを登録する必要があるようなことが書かれている。

タイトルとURLをコピーしました