1

という変数があるとしprogramVersionます。この変数を使用して、HKLM のアプリケーションのバージョンをレジストリに公開します。

このレジストリ値をチェックして、特定のバージョンの別のプログラムがマシンにインストールされているかどうかを確認するための条件がいくつかあります。

<Property Id="ANOTHER_APP_INSTALLED">
  <RegistrySearch Id="AnotherAppInstalled" Root="HKLM"
                    Key="$(var.keyPathProgram)$(var.AnotherProgramVersion)"
                    Name="Path"
                    Type="raw" />
</Property>

しかし、今、OTHER プログラムの新しいバージョンを作成したので、新しいアプリケーションのレジストリに古いバージョンが存在するか、それとも新しいバージョンが存在するかを確認したいと考えています。したがって、次のように両方のバージョンを確認する必要があります。

<Property Id="ANOTHER_APP_INSTALLED">
  <RegistrySearch Id="AnotherAppInstalled" Root="HKLM"
                    Key="$(var.keyPathProgram)$(var.AnotherProgramVersion)"
                    Name="Path"
                    Type="raw" />
</Property>
<Property Id="ANOTHER_APPV11_INSTALLED">
  <RegistrySearch Id="AnotherAppV11Installed" Root="HKLM"
                    Key="$(var.keyPathProgram)$(var.AnotherProgramVersion11)"
                    Name="Path"
                    Type="raw" />
</Property>

変数の後にアスタリスクを付けて、その後に任意の値を受け入れる方法はありますか? このようなもの:

<Property Id="ANOTHER_APP_INSTALLED">
  <RegistrySearch Id="AnotherAppInstalled" Root="HKLM"
                    Key="$(var.keyPathProgram)$(var.AnotherProgramVersion)*"
                    Name="Path"
                    Type="raw" />
</Property>

それらのいずれかがインストールされているかどうかを確認する方法は次のとおりです。

<![CDATA[ ANOTHER_APP_INSTALLED or ANOTHER_APPV11_INSTALLED ]]>

要約:

そのため、自分のアプリケーションではなく、別のアプリケーションが任意のバージョンにインストールされているかどうかを確認するプログラムがマシンにインストールされています。その他のアプリケーションが可能なバージョンのいずれかにインストールされているかどうかを確認する必要があります。

編集: v1、v1.1、v1.2、v1.3... がインストールされているかどうかを確認する必要があります。しかし、そのうちの 1 つだけでなく、すべてを可能なインストール済みバージョンにできるようにする必要があります。製品の存在するすべてのバージョンを確認する必要があります。

これが WiX の通常の動作ではないことはわかっていますが、そのように動作する必要があります。

4

2 に答える 2

2

アップデート

一般に、アプリケーションは、インストールされたバージョンを、すべてのバージョンに共通のキー (キーなど) に入れInstalledVersionます。このキーから値を読み取ったら、それを使用して、WIX 条件を使用してアプリケーションのインストールを許可または禁止することができます。

<Condition Message="This setup requires OTHER software version 1 or higher.">
  <![CDATA[OtherSoftwareVersionProperty >= "1"]]>
</Condition>

上記の条件により、1 以上のその他のソフトウェアの任意のバージョンに対してソフトウェアをインストールできます。

または、これを使用して、特定のバージョンが見つかった場合にのみインストールを許可します。

<Condition Message="This setup requires OTHER software version 1.1.1 or 1.1.2.">
  <![CDATA[OtherSoftwareVersionProperty = "1.1.1" OR OtherSoftwareVersionProperty = "1.1.2"]]>
</Condition>

ただし、その他のソフトウェアがすべてのバージョンに対して個別のキーを作成する場合は、それらのそれぞれに対して個別のレジストリ検索を使用し、上記で説明したように単一の条件でそれらを使用する必要があります。


OPが質問を更新した後、次の回答はあまり意味がありません

プログラムのバージョンを確認し、アップグレードとダウングレードを防止または許可するだけの場合は、 MajorUpgrade要素を確認する必要があると思います。に関する優れたチュートリアルもありHow To: Implement a Major Upgrade In Your Installerます。

アップグレードとダウングレードを防止したいだけの場合は、次を使用できます

<MajorUpgrade AllowDowngrades="no" DowngradeErrorMessage="A newer version of [ProductName] is already installed." Disallow="yes" DisallowUpgradeErrorMessage="Please remove previous version of [ProductName]." />

UpgradeCode要素に属性を必ず追加してくださいProduct

于 2013-06-27T08:42:44.147 に答える
1

レジストリ検索が問題ない場合は、少し上のレベルまで検索してみませんか

何かのようなもの

<RegistrySearch Id="AnotherAppV11Installed" Root="HKLM"
                    Key="$(var.keyPathProgram)"
                    Name="Path"
                    Type="raw" />

または、FileSearch要素を使用して、別のプログラムの特定のファイルバージョンを検出し、ブロッカーで次のように使用することもできます

<![CDATA[ ANOTHER_APP_INSTALLED <10.0     ]]>
于 2013-06-27T12:32:20.950 に答える