Rob Mensching の記事「Remember Property pattern」では、コマンドラインで指定された値が RegSearches によって上書きされないように保護できます。そして、高度なロジック (デフォルト値など) が必要になるまで、すべて正常に動作します。
カスタム アクションでデフォルト値を設定するために、そのパターンを少し拡張しました (それでも問題なく動作します)。
<Fragment>
<Property Id="MY_PROPERTY">
<RegistrySearch Id="MyProperty_RegSearch" Root="HKLM" Key="SOFTWARE\MyCompanyName\MyApplicationName" Name="MyProperty" Type="raw"></RegistrySearch>
</Property>
<DirectoryRef Id="INSTALLDIR">
<Component Id="PermanentRegistryValues" Guid="MY_GUID" Permanent="yes">
<RegistryKey Root="HKLM" Key="SOFTWARE\MyCompanyName\MyApplicationName" Action="create">
<RegistryValue Name="MyProperty" Type="string" Value="[MY_PROPERTY]" />
</RegistryKey>
</Component>
</DirectoryRef>
<CustomAction Id="SaveCmd_MyProperty" Property="cmd_MyProperty" Value="[MY_PROPERTY]" Execute="firstSequence" />
<CustomAction Id="RestoreCmd_MyProperty" Property="MY_PROPERTY" Value="[cmd_MyProperty]" Execute="firstSequence" />
<CustomAction Id="SetDefault_MyProperty" Property="MY_PROPERTY" Value="MyPropertyDefaultValue" Execute="firstSequence" />
<InstallUISequence>
<Custom Action="SaveCmd_MyProperty" Before="AppSearch" />
<Custom Action="RestoreCmd_MyProperty" After="AppSearch">cmd_MyProperty</Custom>
<Custom Action="SetDefault_MyProperty" Before="ValidateProductID">NOT MY_PROPERTY</Custom>
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="SaveCmd_MyProperty" Before="AppSearch" />
<Custom Action="RestoreCmd_MyProperty" After="AppSearch">cmd_MyProperty</Custom>
<Custom Action="SetDefault_MyProperty" Before="ValidateProductID">NOT MY_PROPERTY</Custom>
</InstallExecuteSequence>
</Fragment>
しかし、ここに問題があります:
たとえば、RadioButtonGroup で MyProperty を使用する必要がある場合、WIX (実際には MSI の制限だと思います) では、上記の例のように値を設定せずにこのプロパティを宣言することはできません。ダミーの値を設定することもできません。WIX では別のコンパイル エラーが発生します。
error LGHT0204: ICE34: dummy is not a valid default value for the RadioButtonGroup using property MyProperty. The value must be listed as an option in the RadioButtonGroup table.
また、RadiobuttonGroup に「ダミー」オプションを追加し、そのオプションを RadioButtonGroup コントロールの境界をはるかに超える座標 (1000;1000) に配置しようとしました。ただし、欠点は、キーボードを使用するユーザーがそのオプションを選択できることです。さらに、これは間違いなく悪い習慣です。
だから私の質問: 許可された値の固定セットからデフォルト値が必要な場合に備えて、Remember プロパティパターンを実装する方法はありますか?
これが私が話しているコードの残りの部分です(それがあなたを助けることを願っています):
<Property Id="MY_PROPERTY" Value="Value1">
<RegistrySearch Id="MyProperty_RegSearch" Root="HKLM" Key="SOFTWARE\MyCompanyName\MyApplicationName" Name="MyProperty" Type="raw"></RegistrySearch>
</Property>
<Control Type="RadioButtonGroup" Property="MY_PROPERTY" Id="MyRbtn" Width="100" Height="159" X="34" Y="90">
<RadioButtonGroup Property="MY_PROPERTY">
<RadioButton Text="Value1" Value="Users" Width="100" Height="17" X="0" Y="0" />
<RadioButton Text="Value2" Value="Roles" Width="100" Height="17" X="0" Y="45" />
</RadioButtonGroup>
</Control>
PS: Restore および SetDefault カスタム アクションで多くの条件の組み合わせを試しましたが、必要なすべてのケース (UI モード / サイレント モードでのインストール、アップグレード、変更 / 修復) で機能するものはありませんでした。
これを克服する簡単な方法はありません。唯一の可能性は、ヘルパー プロパティを 1 つ追加し、カスタム アクションの数を 2 倍にすることです (1 つのプロパティに対して既に多くの (3) です)。