2011-09-12 16 views
1

この製品の既存のインストーラは、レジストリに情報を書き込んだり、カスタム環境変数を書き込んだりしません。ユーザーはインストーラのUIでインストールディレクトリを変更することができます。私がアップグレードをしているとき、以前のバージョンがどのフォルダにインストールされているかを調べるにはどうすればよいですか?以前のWIX Installでプログラムがインストールされたフォルダを特定する方法

私は以前の設定ファイル&の値をコピーできるので、そのフォルダを知る必要があります。新しいバージョンの設定ファイルには新しいタグと新しい構造があるので、以前のファイル&をそのまま使用することはできません。

トニー

答えて

1

私はこれにいくつかの研究を行ってきたし、ここで私が思いついた解決策があります:

インストーラがインストールを終了すると、それはパスの下のため

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<Product ID> 

をレジストリ内のノードを作成します32ビットOSでの32ビットインストール、または64ビットOSでの64ビットインストール、または

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\<Product ID> 

(64ビットOSでは32ビットインストール)

このノードには、実行可能ファイルがインストールされている場所へのパスを示すInstallLocationという値が含まれています。

インストーラの以前のバージョンではこのプロパティが設定されていないため、使用できません。しかし、インストーラはサービスを作成します。私はそのサービスのレジストリ内のノードへのパスを見つけました。そこから、ImagePath値の値を取得し、サービスの.EXEファイル名からパスを抽出することができます。

だから私のソリューションはにある:それはINSTALLLOCATION値を設定しないように、新しいインストーラを修正し

  1. 以前のバージョンからのアップグレード時にのみ、サービスのImagePathキーを使用してサービス&のレジストリノードを取得します。
  2. 以降のバージョンからアップグレードする場合は、Uninstallノードを取得してInstallLocationキーを使用します。

申し訳トニー

0

msiexecのは、最後のそれはあなたがちょうどあなた場合にのみ動作しますがInstallExecuteSequenceセクション

<InstallExecuteSequence> 
    <RemoveExistingProducts After="InstallValidate" /> 
</InstallExecuteSequence> 

を含める必要があります以前のバージョンをアンインストール処理しますインストールからMSIのコピーを保持しますProduct Elementで同じUpgradeCode属性を使用しています。

Good Luck!

+0

、私は新しい設定ファイルにコピーするためにそこからデータを読み取ることができるように、古い設定ファイルを検索し、インストールフォルダが必要であることを示すために忘れてしまいました。私はその情報を含めるために質問を編集しました。 –

3

MSIには直接その情報がありません。 (MSIパッケージは複数の "ルート"ディレクトリを持つことができますので、開発者がどちらを希望しているかは分かりません)。レジストリにディレクトリがある場合は、RegistrySearchを使用します。それ以外の場合は、カスタムアクションでMsiGetComponentPathを使用できます。

関連する問題