1

Visual Studio にセットアップ プロジェクトがあります。通常のインストールの一環として、Windows レジストリにいくつかのキーと値を作成/更新します。更新を元に戻すにはどうすればよいですか?

「リバーシブル」と言うかもしれませんが、私はそうは思いません。VS デザイナーを使用して、必要なレジストリ キーと値を指定します。これらのキーと値は、インストール中に書き込まれ、アンインストール中に削除されます。単純。可逆的でないものは何ですか?

インストール中に書き込まれたキーの 1 つに既存の値がある場合に問題が発生します。値が 1 であるとします。次に、新しいインストールで値が 100 になります。アンインストール後、値はまったくなくなります。値はなくなります。


「カスタムアクション」でこれを回避しようとしました。

インストール中にユーザーが確認すると、msiexec は値をレジストリに書き込みます。以前にレジストリ キーにあったものはすべてなくなりました。(これを「アップデート A」と呼びましょう)

その値を保持するために、インストール時に、「前」の設定を読み取って保持するカスタム アクションがあります。「アップデート A」のに実行されます。ここまでは順調ですね。

アンインストール時の通常の手順は、インストール中に追加された通常のレジストリ キーと値を削除することです。これはうまくいきます。これを「更新 B」と呼びます。

元のレジストリ値を復元するために、別の「カスタム アクション」があります。これはアンインストール時に実行されます。元の値がレジストリに正常に復元されます。レジストリは、元のインストール前とまったく同じように見えます。ProcMon (レジストリの更新などを監視できるツール) を使用して、これが機能することを確認しました。これを「更新 C」と呼びます。

1つだけ問題があります。アンインストール時に、更新 C の後に更新 B が実行されます。つまり、カスタム アクションが元のレジストリ設定を復元した後、msi は、他のすべてのレジストリ更新と同様に、復元された値を消去します。

その結果、レジストリには、復元された値ではなく空の値が含まれます。

何か助けはありますか?アップデートを再注文するにはどうすればよいですか? これにはオルカが必要ですか?これを実現するために別のツールをインストールして学習したくありません。それも自動化してほしい。これを実現するために、MSI エディターを視覚的にクリックする必要は絶対にありません。


WindowsInstaller.Installerクラス を使用する Javascript ビルド後のイベントでこれを行うことはできますか? Aaron Stebnerは、「インストール後にアプリケーションを起動しますか?」を追加するスクリプトを公開しました。Visual Studio によって生成された MSI へのダイアログ。Windows インストーラーは「アプリの起動」機能をサポートしていますが、VS2008/2005 のデザイナーでは公開されていません。[Launch] ダイアログに追加された、VS のビルド後のステップとして実行されるクイック biolerplate スクリプト。

カスタムアクションの順序付けで同様のことが可能ですか?

4

1 に答える 1

1

私のためのいくつかの答え:

  • はい、Javascript で実装されたビルド後のステップでこれを行うことができます。
  • はい、WindowsInstaller.Installer クラスを使用します。
  • はい、オルカはそれをすべて理解するために必要でした

Orca は、レジストリ値を削除する組み込みアクションの前に、レジストリ値を復元するためのカスタム アクションが実行されることを明確に示しています。

シャチ

そのため、1698 を 2620 に変更するスクリプトを作成する必要があり、レジストリ値が適切に復元されるはずです。


編集:それほど速くはありません。アイデアは正しいですが、シーケンス番号を変更するほど単純ではありません。問題は、「保存された」レジストリ値がアンインストーラによって削除されるレジストリ ツリーにあることです。したがって、どちらの順序も機能しません。A が復元、B が削除の場合、AB はレジストリのみを復元し、復元された値は後で削除されます。BA が最初に値を削除すると、A には復元する値がなくなります。その理由は、A (復元部分) が、削除するツリーに復元対象の値を格納するためです。

したがって、正しい操作は、A-B-A, where Aが保存された復元する値を取得し、B によって削除されない場所にそれを配置するようなものでなければなりません。次に、B はレジストリ内のアプリ固有のキーと値を削除します。A は、A` によって吸い取られた設定を復元します。

Visual Studio の通常の MSI デザイナーでは特定のシーケンス番号を設定できないため、これらすべてを実現するために、MSI ファイルに対していくつかの操作を行う必要がありました。GUI ツールである Orca を使用する必要があります。または、私の場合は WindowsInstaller への COM インターフェイスを使用して、javascript を介して変更を自動化しました。

于 2009-08-31T10:44:03.080 に答える