2017-12-31 13 views
2

Ich habe ein Installshield-Projekt.InstallShield Haupt-Upgrade deinstalliert alte Version nicht

Ich habe einen großen Upgrade-Artikel hinzugefügt und Product version, Product code und Package code geändert.

Nach der Installation mit dem neuen Installer, ist die alte Version noch vorhanden ist (in add/remove)

Ich denke, es ist auf die Tatsache zurückzuführen ist, dass meine alte Versionsnummer war 1.0.4.23 und neue ist 1.0.4.24 - das ist ein Problem ? Wird bei größeren Upgrades eine so kleine Änderung in der Version ignoriert?

In Major Upgrade common Tab wählte ich Any earlier version

ich erinnere vor mit Versionsnummern dieses Jahr tun 1.1 und 1.2 und alles funktionierte prima, das ist der Hauptgrund, warum ich die aktuelle Ausgabe vermuten auf Versionsnummern in Zusammenhang steht. ..

Können Sie helfen?

Dank

Antwort

4

Ich denke, es ist auf die Tatsache zurückzuführen ist, dass meine alte Versionsnummer war 1.0.4.23 und neue ist 1.0.4.24 - ist das ein Problem? Wird bei größeren Upgrades eine so kleine Änderung in der Version ignoriert?

Ja, nur die ersten drei Felder der Versionsnummer sind für ein größeres Upgrade von Bedeutung. Das vierte Feld wird einfach ignoriert.

Dies wird in einer Notiz an der Major Upgrades MSDN page angegeben.

Wenn Sie ein größeres Upgrade auslösen möchten, muss Ihre neue Versionsnummer 1.0.5.0 oder höher lauten.


Edit:

Als Christopher Painter betont:

Es gibt einen Weg, um dieses, wenn Sie alle vier Felder verwenden müssen. Sie können eine benutzerdefinierte Aktion erstellen, die Ihre eigene Implementierung von FindRelatedProducts ausführt, und legt die Aktionseigenschaft mit einem ProductCode fest, auf den RemoveExistingProducts dann reagiert.

  1. Anruf MsiGetProperty das Upgrade Ihres Produktes zu erhalten:

Die benutzerdefinierte Aktion könnte wie folgt implementiert werden.

  • Rufen Sie MsiEnumRelatedProducts() an, um alle Produkte mit dem gleichen UpgradeCode als Ihr Produkt aufzuzählen.
  • Rufen Sie MsiQueryProductState() an, um zu überprüfen, ob die von MsiEnumRelatedProducts() zurückgegebenen Produkte tatsächlich installiert sind.Ich habe einige Fälle erlebt, in denen MsiEnumRelatedProducts() verwaiste Produkte zurückgegeben hat, die nicht mehr installiert wurden. Daher wird der Code robuster, indem der Installationsstatus mit MsiQueryProductState() überprüft wird.
  • Rufen Sie MsiGetProductInfo() mit INSTALLPROPERTY_VERSIONSTRING als das Argument für den Parameter szProperty auf, um die Version des installierten Produkts abzufragen. Verwenden Sie nicht INSTALLPROPERTY_VERSION stattdessen, weil INSTALLPROPERTY_VERSION von nur den ersten drei Feldern der Versionsnummer abgeleitet wird, das Problem, das wir vermeiden möchten.
  • Wenn Sie Versionsnummern vergleichen, stellen Sie sicher, dass Sie nicht nur die Zeichenfolgen, sondern parse the strings into the fields that are separated by '.' and compare the fields individually vergleichen.
  • Wenn Sie ein gesuchtes Produkt gefunden, die Sie ersetzen möchten, rufen MsiSetProperty() die ActionProperty zum Product dieses Produkts einzustellen, dass RemoveExistingProducts dann wirkt auf.
  • +0

    Vielen Dank für den Verweis in Ihrer Antwort. – Noam

    +1

    Es gibt einen Weg darum, wenn Sie alle vier Felder verwenden müssen. Sie können eine benutzerdefinierte Aktion erstellen, die Ihre eigene Implementierung von FindRelatedProducts ausführt, und die Aktionseigenschaft mit einem ProductCode festlegen, auf den RemoveExistingProducts dann reagiert. –

    +1

    @ChristopherPainter Ich habe die Schritte einer möglichen Implementierung einer solchen benutzerdefinierten Aktion hinzugefügt. – zett42

    Verwandte Themen