この質問に対する明確な答えは、WiXドキュメント(または、さらに言えばGoogle)では見つかりませんでした。もちろん、HKCRで適切なレジストリキーを作成することもできますが、それは私を汚く感じさせ、これが標準的なタスクであり、優れたデフォルトのソリューションを持つはずです。
ボーナスポイントについては、「安全」にする方法を知りたいです。つまり、ファイルタイプの既存の登録を上書きせず、インストール中に登録されて変更されていない場合にのみ、アンインストール時に登録を削除します。
この質問に対する明確な答えは、WiXドキュメント(または、さらに言えばGoogle)では見つかりませんでした。もちろん、HKCRで適切なレジストリキーを作成することもできますが、それは私を汚く感じさせ、これが標準的なタスクであり、優れたデフォルトのソリューションを持つはずです。
ボーナスポイントについては、「安全」にする方法を知りたいです。つまり、ファイルタイプの既存の登録を上書きせず、インストール中に登録されて変更されていない場合にのみ、アンインストール時に登録を削除します。
残念ながら、Windowsインストーラとの「安全な」関連付けを行う方法はありません。
すべてをレジストリに書き出すだけで、システム全体のデフォルトを引き継ぐ別のコンポーネントがあり、他のアプリケーションがデフォルトとして登録されていない場合にのみインストールされます。
Vistaには、新しい「デフォルトプログラム」インターフェイスがあります。ここでも、すべてをレジストリに書き込みます。これは、インストーラーで使用している完全な例です。(WiX 3.0)
更新:最初の回答から12か月が経過し、ファイルの関連付けについての理解が深まりました。すべてを手動で記述するのではなく、ProgId
アドバタイズされたパッケージの処理を改善する適切な定義を使用しています。この質問に答えて投稿された更新されたコードを参照してください。
<Component ....>
<RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities" Name="ApplicationDescription" Value="ACME Foobar XYZ Editor" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities" Name="ApplicationIcon" Value="[APPLICATIONFOLDER]AcmeFoobar.exe,0" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities" Name="ApplicationName" Value="ACME Foobar" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities\DefaultIcon" Value="[APPLICATIONFOLDER]AcmeFoobar.exe,1" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities\FileAssociations" Name=".xyz" Value="AcmeFoobar.Document" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities\MIMEAssociations" Name="application/xyz" Value="AcmeFoobar.Document" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\AcmeFoobar\Capabilities\shell\Open\command" Value=""[APPLICATIONFOLDER]AcmeFoobar.exe" "%1"" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\RegisteredApplications" Name="Acme Foobar" Value="SOFTWARE\AcmeFoobar\Capabilities" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.xyz" Name="Content Type" Value="application/xyz" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.xyz\AcmeFoobar.Document\ShellNew" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.xyz\OpenWithList\AcmeFoobar.exe" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.xyz\OpenWithProgids" Name="AcmeFoobar.Document" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\AcmeFoobar.exe\SupportedTypes" Name=".xyz" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\AcmeFoobar.exe\shell\open" Name="FriendlyAppName" Value="ACME Foobar" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcmeFoobar.exe" Value="[!AcmeFoobar.exe]" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcmeFoobar.exe" Name="Path" Value="[APPLICATIONFOLDER]" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\SystemFileAssociations\.xyz\shell\edit.AcmeFoobar.exe" Value="Edit with ACME Foobar" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\SystemFileAssociations\.xyz\shell\edit.AcmeFoobar.exe\command" Value=""[APPLICATIONFOLDER]AcmeFoobar.exe" "%1"" Type="string" />
</Component>
<Component ....>
<ProgId Id="AcmeFoobar.Document" Description="ACME XYZ Document">
<Extension Id="pdf" ContentType="application/xyz">
<Verb Id="open" Command="Open" TargetFile="[APPLICATIONFOLDER]AcmeFoobar.exe" Argument="%1" />
</Extension>
</ProgId>
<Condition><![CDATA[DEFAULTVIEWER=1]]></Condition>
</Component>
いくつかの追加調査の後、 WiX チュートリアルでこの質問に対する部分的な回答を見つけました。宣伝されている解決策を示しており、WiX 3.0 では動作しませんが、その情報を考慮して、私はそれを理解しました。次のように、実行可能ファイルを含むコンポーネントに ProgId 要素を追加します。
<ProgId Id="MyApplication.MyFile" Description="My file type">
<Extension Id="myext" ContentType="application/whatever">
<Verb Id="open" Command="open" TargetFile="MyApplication.exe" Argument=""%1""/>
</Extension>
</ProgId>
myext はドットを除いたファイル拡張子で、MyApplication.exe は実行可能ファイルのファイル ID (名前ではない) です (つまり、File 要素の Id 属性)。これにより、ファイルの種類が実行可能ファイルに登録され、既定のアイコン (アプリケーション アイコンが表示された白いページ) が提供されます。これで十分です。専用のアイコンを指定する場合は、次のように自分で行う必要があるようです (リンクされたチュートリアルのコード)。
<Registry Id='FooIcon1' Root='HKCR' Key='.xyz' Action='write' Type='string' Value='AcmeFoobar.xyzfile' />
<Registry Id='FooIcon2' Root='HKCR' Key='AcmeFoobar.xyzfile' Action='write' Type='string' Value='Acme Foobar data file' />
<Registry Id='FooIcon3' Root='HKCR' Key='AcmeFoobar.xyzfile\DefaultIcon' Action='write' Type='string' Value='[INSTALLDIR]Foobar.exe,1' />
ただし、おまけの質問に対する適切な解決策が見つかりませんでした。
編集:前の回答が来る前にこれを書き始めました。ただし、前の回答とは対照的に、私のソリューションは実際には機能します。
「アプリケーションが独自のファイル データ タイプを処理する場合は、ファイルの関連付けを登録する必要があります。コンポーネント内に ProgId を配置します。FileId は、このファイルを処理するためのファイルを記述する File 要素の Id 属性を参照する必要があります。感嘆符に注意してください: ファイルの長いパスではなく短いパスを返します:"
<ProgId Id='AcmeFoobar.xyzfile' Description='Acme Foobar data file'>
<Extension Id='xyz' ContentType='application/xyz'>
<Verb Id='open' Sequence='10' Command='Open' Target='[!FileId]' Argument='"%1"' />
</Extension>
</ProgId>
参考:https ://www.firegiant.com/wix/tutorial/getting-started/beyond-files/