2009-08-31 19 views
1

私はVisual Studioでセットアッププロジェクトを持っています。通常のインストールの一部として、Windowsレジストリにいくつかのキーと値を作成/更新します。アップデートを元に戻すにはどうすればいいですか?VSセットアッププロジェクト。アンインストール時にレジストリ値を復元するには?

あなたは「彼らは可逆です」と言うかもしれませんが、私はそうは思わないのです。どのように私はそれが動作すると思います:どのレジストリキーと値を指定するVSデザイナーを使用します。これらのキーと値は、インストール時に書き込まれ、アンインストール時に削除されます。シンプル。リバーシブルではないのは何ですか?

インストール中に書き込まれたキーのいずれかに既存の値がある場合に問題が発生します。新しいインストールでは100の値を取得します。アンインストール後、値はまったくありません。値はなくなります。


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

ユーザーが確認した場合、msiexecは値をレジストリに書き込みます。以前のレジストリキーにあったものはなくなりました。

この値を保存するには、インストール時に "before"設定を読み込んで保存するカスタムアクションがあります。それはの前に "更新A"を実行します。ここまでは順調ですね。

通常、アンインストール時に、インストール中に追加された正規のレジストリキーと値を削除します。これはうまく動作します。この "更新B"と呼んでください。

元のレジストリ値を復元するには、別の「カスタムアクション」があります。これはアンインストール時に実行されます。元の値がレジストリに正常に復元されます。レジストリは元のインストール前と同じように見えます。私はこれがProcMon(とりわけレジストリアップデートを監視するツール)を使って動作することを確認しました。この "Update C"と呼んでください。

問題は1つだけです。アンインストール時に、アップデートBがアップデートCの後にに発生しています。これは、カスタムアクションが元のレジストリ設定を復元した後、msiは他のすべてのレジストリアップデートと同様にリストアされた値を消去します。

結果、レジストリには復元された値の代わりに空の値があります。

助けが必要ですか?アップデートをどのように並べ替えることができますか?これにはOrcaが必要ですか?私は実際にこれを実現させるために別のツールをインストールして勉強したくありません。私はまたそれが自動であることを望む。間違いなく、これを実現させるためにMSIエディタを視覚的にクリックする必要はありません。


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

カスタムアクションの発注と同様のことがありますか?

答えて

1

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

  • はい、それはJavaScriptで実装ポストビルドステップでこれを行うことが可能です。
  • はい、WindowsInstaller.Installerクラスを使用します。
  • はい、シャチは

をそれをすべて把握する必要があったオルカが明確に示してレジストリ値を復元するために意図されたカスタムアクションは、レジストリ値を削除し、組み込みのアクションの前に実行されます。

orca http://i31.tinypic.com/33vc02b.jpg

だから私は2620年に1698に変更するスクリプトを記述する必要があり、レジストリの値が正しく復元されるはずです。


編集:それほど速くありません。 アイデアは正しいですが、シーケンス番号を変更するだけでは簡単ではありません。問題は、 "保存された"レジストリ値がアンインストーラによって削除されるレジストリツリーにあることです。したがって、どちらの注文も機能しません。 Aが復元でBが削除の場合、A-Bは復元された値を後で削除するようにレジストリを復元します。 B-Aは最初に値を削除し、Aは復元する値を持ちません。その理由は、A(復元部)は、復元対象の値を削除対象のツリーに格納するからである。

正しい操作は、A-B-A, where Aが復元された保存値を受け取り、Bによって削除されない場所に配置します。次に、Bはアプリケーション固有のキーを削除し、レジストリ内の値。 AはA 'によって撃たれた設定を復元する。

Visual StudioのバニラMSIデザイナーは特定のシーケンス番号を設定することができないため、これをすべて行うにはMSIファイルに対して手術をしなければなりませんでした。 GUIツールであるOrcaを使用する必要があります。または、私の場合、WindowsInstallerのCOMインターフェイスを使用してjavascriptによる変更を自動化する必要があります。

関連する問題