5

在使用使用 InstallShield 2012 Spring 构建的安装程序进行升级期间,我看到以下消息:

  1. InstallShield 向导会将 <我们的产品> 的已安装版本 (9.01.005) 更新到版本 9.2.0.53。
  2. InstallShield 向导正在将 <我们的产品> 的 (9.01.005) 更新到版本 9.2.0.53。

这些消息基于字符串资源IDS_IFX_SDWELCOMMESSAGE_UPDATE_WELCOMEIDS_IFX_STATUSEX_STATICTEXT_UPDATEUI. 我相信未更改的字符串资源将如下所示:

  • InstallShield 向导会将已安装的 %P 版本 (%VI) 更新到版本 %VS。要继续,请单击下一步。
  • InstallShield 向导正在将 %P 更新 (%VI) 到版本 %VS。

尽管一些资源表明第二个字符串资源是“InstallShield Wizard is updated %VI of %P to version %VS”。

问题是旧的(安装的)版本号应该是像“9.1.5.2”这样的显示字符串,而不是像“9.01.005”这样的内部版本号的格式化版本。据我了解,它SdSubstituteProductInfo用于IFX_INSTALLED_DISPLAY_VERSION填充默认 InstallScript 代码%VI中的替换。OnUpdateUIBefore并且IFX_INSTALLED_DISPLAY_VERSION默认来自IFX_INSTALLED_VERSION,这解释了为什么首选显示字符串没有出现在我们想要的位置。而且我假设SdWelcome(或任何类似引用的对话框或代码IFX_INSTALLED_DISPLAY_VERSION)也显示格式错误的版本。

尽管我在网上搜索了上面提到的函数、字符串和字符串 ID,但我还没有找到以正确格式显示正确格式的旧版本号 (DisplayVersion) 的理想解决方案。一些文章建议对跳过旧版本号的格式字符串进行硬编码,而不是使用包含%VI. 其他人建议根据需要手动格式化版本号并将结果放入IFX_INSTALLED_DISPLAY_VERSION. 我知道有一个更好的答案,并且我希望下次我或其他人寻找它时更容易找到它。

4

1 回答 1

4

OnBeginInstallScript 函数中,将以下 InstallScript 代码行添加为第一行之后begin

RegDBGetItem(REGDB_UNINSTALL_DISPLAY_VERSION, IFX_INSTALLED_DISPLAY_VERSION);

在 OnBegin 中执行此操作还可以确保问题中未提及的另一条消息使用正确的格式:

安装程序检测到已经安装了 %P 的 %VI 版本。

此安装程序会安装较早版本的 %P (%VS)。

在安装此版本之前,您必须卸载以前的版本。

于 2013-01-23T16:58:43.970 回答