7

アンインストール中にインストーラーがレジストリ キーを削除するか保持するかをユーザーが指定できるようにする必要があります。これが私がすることです。次のような Condition 要素を持つ RemoveRegistryKey コンポーネントがあります。

<Component
    Id="ID"
    Guid="GUID"
    KeyPath="yes" >

    <Condition></Condition>

    <RemoveRegistryKey
        Root="HKLM"
        Key="Software\PATH_TO_KEY" 
        Action="removeOnUninstall"/>
</Component>

これは期待どおりに動作するようです。Condition 要素を0にハード コードすると、レジストリ キーは残ります。1に設定すると、レジストリ キーは削除されます。(このレジストリ キーを作成する別のコンポーネントがありますが、私はそのForceDeleteOnUninstall属性をnoに設定しました。)

ここで、アンインストール中にユーザー入力を介してこの状態を制御する必要があります。次のような C# の CA があります。

[CustomAction]
public static ActionResult AskUser(Session session)
{
    MessageResult result = session.Message
    (
        InstallMessage.User +
            (int)MessageBoxIcon.Information +
            (int)MessageBoxButtons.YesNo,
            new Record { FormatString = String.Format("Delete registry key?") }
    );

    if (result == MessageResult.Yes)
        session["DELETEREGKEY"] = "1";

    return ActionResult.Success;
}

次のコードを使用して CA の実行をスケジュールします。

<CustomAction Id="AskUserCA" BinaryKey="CA_Dll" DllEntry="AskUser" Execute="immediate" />

<InstallExecuteSequence>
    <Custom Action="AskUserCA" Before="InstallValidate">(REMOVE="ALL") AND (NOT UPGRADINGPRODUCTCODE)</Custom>
</InstallExecuteSequence>

そして、RemoveRegistryKey コンポーネントの Condition 要素を次のように設定します。

<Condition>DELETEREGKEY="1"</Condition>

DELETEREGKEY=1 と DELETEREGKEY も試しましたが、CA からプロンプトが表示され (アンインストールの確認ダイアログ ボックスの後に表示されます)、DELETEREGKEY が 1 に設定されていることがログ ファイル (ログを使用している場合) で確認できますが、応答 (はいまたはいいえ) に関係なく、レジストリ キーは削除されません。他のイベントの前後に CA をスケジュールしようとしましたが、何も役に立たないようです。

この条件が常に false と評価されるように見えるのはなぜですか? それを機能させる方法はありますか?

また、より良い代替手段はありますか?アンインストール ダイアログを変更して、ユーザーにレジストリ キーの削除を促すチェック ボックスを追加することを考えていましたが、その方法がわかりません。インストール シーケンスに変更を加える方法 (既存のダイアログを変更するか、新しいダイアログを追加する方法) は知っていますが (変更された WixUI_InstallDir シーケンスを使用しています)、アンインストール時にそれを行う方法がわかりません。

何か案は?

4

3 に答える 3

5

通常、ダイアログは実行シーケンスではなく UI シーケンスでスケジュールします。これを行っていない場合、サイレント (アン) インストールを行うことはできません。

CustomAction (CA) の実行が遅く、実行されるスクリプトが既に作成されていると思います。 DELETEREGKEYこの場合、設定が解除され、false と評価されます。結果のキーは保持されます。

CA を UI-Sequence に移動してみてください。

于 2013-10-01T07:39:32.807 に答える
0

ここで私自身の調査結果を要約します。

条件を評価するときに有効になるには、実行シーケンスでプロパティを設定するのが遅すぎるようです。ただし、CA を UI シーケンスに移動することは適切なオプションではありません。これは、デフォルトではアンインストールが UI をバイパスするサイレント モードで実行されるためです。カスタム アンインストール ショートカットとプログラムの追加と削除 (ARP) エントリを微調整して、完全な UI モードでアンインストーラを実行する方法がありますが、これには独自の手間がかかります。ARP レジストリ エントリを手動で入力する必要はありません。

私が取ったアプローチは、シーケンスの実行中に呼び出されたのと同じ CA でプログラムによってレジストリ キーを単純に削除することでした (したがって、RemoveRegistryKey コンポーネントは必要ありません)。サイレント アンインストールを可能にするために、コマンド ライン オプションも追加して、レジストリ キーを削除するかどうか、およびプロンプトを表示するかどうか (キーの削除スイッチが指定されていない場合) を指定します。デフォルトでは、レジストリ キーを保持しています。あまりエレガントではありませんが、仕事をしているようです。

アンインストール ダイアログの変更に関する提案については、WiX 3.7: アンインストール中にダイアログを追加または更新する方法を参照してください。

于 2013-10-13T07:26:31.533 に答える