2017-12-31 64 views
2

私はInstallshieldプロジェクトを持っています。Installshieldメジャーアップグレードで古いバージョンがアンインストールされない

私は大きなアップグレード項目を追加し、Product version,​​およびPackage codeを変更しました。

新しいインストーラでインストールした後、古いバージョンは(add/removeで)まだ存在する

私はそれは私の古いバージョン番号が1.0.4.23あったという事実に関連すると思うと新しいものが1.0.4.24ある - これは問題です?メジャーアップグレードはバージョンの小さな変更を無視しますか?私はバージョン番号1.11.2で、この年前にやって覚え、すべてが素晴らしい仕事Any earlier version

を選んだのメジャーアップグレードcommonタブで

、これは私が現在の問題は、バージョン番号に関係している疑いが主な理由です。 ..

お手伝いできますか?

おかげ

答えて

4

私はそれは私の古いバージョン番号が 1.0.4.23あったという事実に関連すると思うと新しいものが1.0.4.24である - これは問題でしょうか?メジャーアップグレードはバージョンの小さな変更を無視しますか?

はい、メジャーアップグレードでは、バージョン番号の最初の3つのフィールドだけが重要です。 4番目のフィールドは単に無視されます。

これはMajor Upgrades MSDN pageの注記に記載されています。

メジャーアップグレードを開始する場合は、新しいバージョン番号を1.0.5.0以上にする必要があります。


編集:

クリストファー画家が指摘するように:

あなたはすべての4つのフィールドを使用しなければならない場合は、この回避する方法があります。 FindRelatedProductsの独自の実装を行うカスタムアクションを作成し、RemoveExistingProductsが動作するProductCode でアクションプロパティを設定することができます。

カスタムアクションは、このように実装することができます

  1. 製品ののUpgradeCodeを取得するために呼び出すMsiGetProperty
  2. MsiEnumRelatedProducts()を呼び出して、アップグレードコードをすべての製品として列挙してください。
  3. MsiQueryProductState()を呼び出して、MsiEnumRelatedProducts()が返す製品が実際にインストールされていることを確認してください。MsiEnumRelatedProducts()が、もはやインストールされていない孤立した製品を返す場合がありました。したがって、コードはインストール状態をMsiQueryProductState()で二重チェックすることにより、より堅牢になります。
  4. インストールされた製品のバージョンを照会するszPropertyパラメーターの引数としてINSTALLPROPERTY_VERSIONSTRINGMsiGetProductInfo()と呼びます。 INSTALLPROPERTY_VERSIONを代わりに使用しないでください。INSTALLPROPERTY_VERSIONは、バージョン番号の最初の3つのフィールド(拒否したい問題)からのみ派生しているためです。
  5. バージョン番号を比較するときは、文字列を比較するだけでなく、parse the strings into the fields that are separated by '.' and compare the fields individuallyを確認してください。
  6. 交換する製品が見つかった場合はに電話してActionPropertyに設定し、この製品のProductCodeRemoveExistingProductsが対応するように設定してください。
+0

ご回答いただきありがとうございます。 – Noam

+1

4つのフィールドをすべて使用する必要がある場合は、これを回避する手段があります。 FindRelatedProductsの独自の実装を行うカスタムアクションを作成し、RemoveExistingProductsが動作するProductCodeでアクションプロパティを設定することができます。 –

+1

@ChristopherPainterこのようなカスタムアクションの可能な実装のステップを追加しました。 – zett42

関連する問題