ホーム

私訳です。より確かな記述は MSDN (英語)を直接読んで下さい。

 

MSDN > MSDN Library > Win32 and COM Development > Administration and Management > Application Installation and Servicing > Windows Installer > Windows Installer Guide > Patching and Upgrades > Major Upgrades > Preventing an Old Package from Installing Over a Newer Version

古いパッケージをより新しいバージョンの上にインストールさせない


Windows Installer アップグレード パッケージは、もしユーザーが既により新しいバージョンを インストールしていると インストールされないメジャーアップグレードを持つように書かれる事が あります。このトピック中のやり方は、メジャーアップグレード パッケージの実行によって発生する ダウングレードだけを妨げる事ができます。このやり方は、最初のインストールの時にだけ実行され メンテナンスモード(再インストール)では実行されない、 FindRelatedProducts アクション ( 英語 ) を当てにしています。マイナーアップグレードが再インストールを 使って行われるので、このやり方は マイナーアップグレードがアプリケーションをダウングレード しようとしているかどうかを決定するのに使うことはできません。より多くのインフォメーションに 関しては、 将来のメジャー アップグレードの為の アプリケーションの準備 ( Preparing an Application for Future Major Upgrades ) を見て下さい。

http://i.msdn.microsoft.com/Aa370840.wedge(en-us,VS.85).gif古いパッケージをより新しいバージョンの上にインストールするのを妨げるには

  1. このアップグレードを受け取る資格があるかもしれない 同族プロダクトのグループの為の UpgradeCode プロパティを Upgrade Table の UpgradeCode カラムに入力する。
  2. Upgrade テーブルの Attributes カラム中に msidbUpgradeAttributesOnlyDetect ビット フラグを 入力する。
  3. このパッケージによって提供されるアップグレードのバージョンを Upgrade テーブルの VersionMin カラムに入力する。VersionMax カラムを無記入のままにする。
  4. FindRelatedProducts アクションによりセットされるべきプロパティの名前を Upgrade Table の ActionProperty カラムに入力する。
  5. Property Table SecureCustomProperties プロパティと Upgrade Table の ActionProperty カラム中で名付けられたプロパティを追加する。
  6. InstallExecuteSequence テーブル ( 英語 ) 中で FindRelatedProducts アクションの後に Custom Action Type 19 を追加する。このアクションの為に CustomAction Table 中にレコードを含め、Target カラム中に表示されるべきテキストを入力 する。タイプ 19 カスタムアクションはインストーラーに組み込まれているので、書き込むコードは ありません。
  7. ActionProperty の名前を カスタムアクション タイプ 19 を含む InstallExecuteSequence テーブルのレコードの Condition カラムに入力する。これはカスタムアクションを、Upgrade テーブルがより新しいバージョンが既にインストールされていると検出した時にだけ 実行される ように条件付けます。

    例えば、同族プロダクトのグループをバージョン 3.0 にアップグレードする Windows Installer パッケージは、中に以下のレコード、Upgrade、CustomAction、InstallExecuteSequence、 Property テーブルを含んでいるかもしれません。グループ中の同族プロダクト全てが 同じ UpgradeCode を持っていますが、インストーラーは コンピューター上に 3.0 よりあとのバージョン が既にインストールされていると このアップグレード パッケージをインストールしません。この場合 には、インストーラーはエラーメッセージを出して、インストールは失敗します。バージョン 3.0 アップグレード パッケージは、バージョン 1.0 と 2.0 上でインストールします。

    Upgrade テーブル

    UpgradeCodeVersionMinVersionMaxLanguageAttributesRemoveActionProperty
    {E7BE6D45-49FF-4701-A17E-BDCC98CE180D}3.0 msidbUpgradeAttributesOnlyDetectNEWPRODUCTFOUND
    {E7BE6D45-49FF-4701-A17E-BDCC98CE180D}1.03.0msidbUpgradeAttributesVersionMinInclusiveUPGRADEFOUND

    CustomAction テーブル

    ActionTypeSourceTarget
    CA119A higher upgrade is already installed.

    InstallExecuteSequence テーブル ( 英語 )

    ActionConditionSequence
    FindRelatedProducts200
    CA1NEWPRODUCTFOUND201

    Property テーブル

    PropertyValue
    SecureCustomPropertiesNEWPRODUCTFOUND;UPGRADEFOUND





英語のページですが、WiX の為に詳しく説明してありました。ぜひ読んで置いて下さい。
Alex Shevchuk si-9



コードページや言語の変更が必要なら、各自で行ってください。

<!-- メジャーアップグレードの話なので ProductCode が別々のはず -->
<?define ProductVersion="3.0.0" ?>
<?define RTMProductVersion="1.0.0" ?>
<Upgrade Id="ここにプロダクトの(共通した)UpgradeCode を書く">
  <UpgradeVersion Minimum="$(var.ProductVersion)"
      IncludeMinimum="no"
      OnlyDetect="yes"
      Language="1033"
      Property="NEWPRODUCTFOUND" />

  <UpgradeVersion Minimum="$(var.RTMProductVersion)"
      IncludeMinimum="yes"
      Maximum="$(var.ProductVersion)"
      IncludeMaximum="no"
      Language="1033"
      Property="UPGRADEFOUND" />
</Upgrade>
<!-- ダウングレードさせない -->
<CustomAction Id="PreventDowngrading"
              Error="A higher upgrade is already installed." />
<InstallExecuteSequence>
  <Custom Action="PreventDowngrading"
          After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
  <RemoveExistingProducts After="InstallFinalize" />
</InstallExecuteSequence>

<!-- 上のリンク先 FindRelatedProducts アクションに書いてあるように こちらも必要 -->
<InstallUISequence>
  <Custom Action="PreventDowngrading"
          After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
</InstallUISequence>