[WiX] ショートカットのKeypath

msiのコンポーネントをインストールしたことを記憶するためにkeypathをファイルシステム上に残す。msiはこのkeypathがあるかどうかをコンポーネントがインストールされているかどうかの判断基準にする。

スタートメニューのショートカット作成のhelpにある手順は以下の通り。

1. アプリケーションのメニュのディレクトリ構造を定義。

<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="My Application Name"/>
</Directory>

2. ショートカットのコンポーネントを作成。

<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="ApplicationShortcut" Guid="PUT-GUID-HERE">
<Shortcut Id="ApplicationStartMenuShortcut"
Name="My Application Name"
Description="My Application Description"
Target="[APPLICATIONROOTDIRECTORY]MyApplication.exe"
WorkingDirectory="APPLICATIONROOTDIRECTORY"/>
<RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
<RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplicationName" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
</Component>
</DirectoryRef>

3. インストール指示。

<ComponentRef Id="ApplicationShortcut" />

大半のWiXユーザーはこのやり方を踏襲していると思う。

しかし、この方法では、allusersのショートカットの存在があるユーザーのregistryと関連付けされる。この方法の欠点は、そのユーザーがなくなるとallusersのショートカットのインストールに関する情報が失われる、ということだ。

HKCUをHKMUに変更すると、ICEのエラーが発生する。

[HKMU指定時のエラー]

error LGHT0204: ICE57: Component 'ProgramMenuDir' has both per-user data and a keypath that can be either per-user or per-machine.

stackoverflowの以下のエントリでこれを回避する内容のエントリがあった。

Wix create non advertised shortcut for all users / per machine
http://stackoverflow.com/questions/2058230/wix-create-non-advertised-shortcut-for-all-users-per-machine

  1.  InstallScope=”perMachine” としてallusersに対するインストールとする。
  2.  Productのプロパティに
     <Property Id="DISABLEADVTSHORTCUTS" Value="1" />
    

    を指定する。

  3. shortcutをadvertisedにする。
    shortcutのattributeに、Advertise=”yes”  とする。

このようにすると、

  1.  advertised shortcutを作成する指示になるため、HKMU以下のレジストリをkeypathにすることができる。
  2.  advertiseなshortcutは non advertiseにmsiによって変更される。

という2つの処理の組み合わせでユーザーアカウントと独立なkeypathができる。

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。