1

WiX インストール プロセスで編集コントロールを使用してレジストリの値を更新しようとしています。

次のように使用している編集コントロールを使用しても問題ありません-

<Property Id="WIXUI_USERLIST" Value="Demo;" Secure="yes"/>
<Control Id="UsersList" Type="Edit" X="105" Y="192" Width="180" Height="18" Property="WIXUI_USERLIST" Indirect="no" />

これは、ユーザー入力を受け取り、WIXUI_USERLIST を使用してレジストリに値をプッシュするのに問題なく機能します。

次のコードを導入してレジストリを読み取り、プロパティの編集コントロールに既存の値を表示し、それを WIXUI_USERLIST にアタッチすると、問題が発生します。

    <Property Id="USERLIST" Secure="yes">
      <RegistrySearch Id="UserList"
      Root="HKLM"
      Key="[APPLICATIONHIVE]"
      Name="UserList"
      Type="raw"
      Win64="yes" />
    </Property>

<SetProperty Id="WIXUI_USERLIST" Value="[USERLIST]" After="AppSearch">USERLIST</SetProperty>

ログを見ると、値が INSTALL フェーズに正しく渡されていることが示唆されますが、USERLIST によって上書きされます。

Action 14:37:22: INSTALL. 
Action start 14:37:22: INSTALL.
MSI (s) (78:44) [14:37:22:770]: Running ExecuteSequence
MSI (s) (78:44) [14:37:22:770]: Doing action: FindRelatedProducts
MSI (s) (78:44) [14:37:22:770]: Note: 1: 2205 2:  3: ActionText 
Action 14:37:22: FindRelatedProducts. Searching for related applications
Action start 14:37:22: FindRelatedProducts.
MSI (s) (78:44) [14:37:22:772]: Skipping FindRelatedProducts action: already done on client side
Action ended 14:37:22: FindRelatedProducts. Return value 0.
MSI (s) (78:44) [14:37:22:772]: Doing action: AppSearch
MSI (s) (78:44) [14:37:22:772]: Note: 1: 2205 2:  3: ActionText 
Action 14:37:22: AppSearch. Searching for installed applications
Action start 14:37:22: AppSearch.
MSI (s) (78:44) [14:37:22:774]: Skipping AppSearch action: already done on client side
Action ended 14:37:22: AppSearch. Return value 0.
MSI (s) (78:44) [14:37:22:774]: Doing action: WIXUI_USERLIST
MSI (s) (78:44) [14:37:22:774]: Note: 1: 2205 2:  3: ActionText 
Action 14:37:22: WIXUI_USERLIST. 
Action start 14:37:22: WIXUI_USERLIST
MSI (s) (78:44) [14:37:22:775]: PROPERTY CHANGE: Modifying WIXUI_USERLIST property. Its current value is 'Gurinder;TestUser'. Its new value: 'Gurinder'.
Action ended 14:37:22: SetWIXUI_PORTSERVERADD. Return value 1..

ログでは、「Gurinder」がレジストリに保存され、インストール中に「Gurinder;TestUser」に編集されます

4

1 に答える 1

1

この問題を解決するにはいくつかの方法がありますが、おそらく次の方法が最も効率的だと思います。すでに行っていることを少し調整するだけです。

まず、いつでも設定できるUSERLISTようにデフォルト値を入れます。次に、 UI または実行シーケンスで を 1 回だけ設定する必要があります。要素はこの機能を公開しませんが、要素を使用してアクセスできます。アクションをシーケンス内で 1 回だけ実行するのは魔法です。WIXUI_USERLISTWIXUI_USERLISTSetPropertyCustomAction

プロパティを設定する結果のコードは、次のようになります。

<Property Id="USERLIST" Value="Demo;" Secure="yes">
  <RegistrySearch Id="UserList"
  Root="HKLM"
  Key="[APPLICATIONHIVE]"
  Name="UserList"
  Type="raw"
  Win64="yes" />
</Property>

<!-- replaces SetProperty but adds the ability to run only in the first sequence -->
<CustomAction Id='SetWIXUI_USERLIST' Property='WIXUI_USERLIST' Value='[USERLIST]'
              Execute='firstSequence'>
<InstallUISequence>
    <Custom Action='SetWIXUI_USERLIST' After='AppSearch' />
</InstallUISequence>
<InstallExecuteSequence>
    <Custom Action='SetWIXUI_USERLIST' After='AppSearch' />
</InstallExecuteSequence>

更新: さらに、MSI SDK に対してメモリを再確認しました。AppSearch アクションは 1 回だけ実行されます。つまり、おそらくすべてのWIXUI_USERLISTカスタムアクションやものを削除して、USERLISTどこでも使用できると思います。WIXUI_USERLISTしたがって、さらに簡単な解決策は、これをすべて削除して、 yourのすべてのインスタンスを に置き換えることUSERLISTです。:)

于 2013-05-02T15:17:24.927 に答える