Обновление, созданное InstallShield 2012, сообщает об установленной версии в неправильном формате

Я вижу следующие сообщения во время обновления с помощью установщика, созданного с помощью 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_WELCOME и IDS_IFX_STATUSEX_STATICTEXT_UPDATEUI. Я считаю, что неизмененные строковые ресурсы будут выглядеть так:

  • Мастер InstallShield обновит установленную версию (%VI) %P до версии %VS. Чтобы продолжить, нажмите Далее.
  • Мастер InstallShield обновляет (%VI) %P до версии %VS.

хотя некоторые ресурсы указывают, что второй строковый ресурс — «Мастер InstallShield обновил %VI из %P до версии %VS».

Проблема в том, что старый (установленный) номер версии должен быть отображаемой строкой, такой как «9.1.5.2», а не отформатированной версией внутреннего номера версии, например «9.01.005». Насколько я понимаю, SdSubstituteProductInfo использует IFX_INSTALLED_DISPLAY_VERSION для заполнения замены %VI в коде InstallScript по умолчанию для OnUpdateUIBefore. И IFX_INSTALLED_DISPLAY_VERSION по умолчанию вместо IFX_INSTALLED_VERSION, что объясняет, почему предпочтительная отображаемая строка не появляется там, где мы хотели бы. И я предполагаю, что SdWelcome (или любое диалоговое окно или код, аналогично ссылающийся на IFX_INSTALLED_DISPLAY_VERSION), также отображает плохо отформатированную версию.

Несмотря на все мои поиски в Интернете функций, строк и идентификаторов строк, упомянутых выше, я не нашел идеального решения для отображения правильно отформатированного номера старой версии (DisplayVersion) в правильном формате. В некоторых статьях предлагается жестко кодировать строку формата, которая пропускает старый номер версии, вместо использования строкового ресурса, включающего %VI. Другие предлагают вручную отформатировать номер версии по желанию и поместить результат в IFX_INSTALLED_DISPLAY_VERSION. Я знаю, что есть лучший ответ, и я хочу, чтобы его было легче найти в следующий раз, когда я или кто-либо другой будет его искать.


person BlueMonkMN    schedule 23.01.2013    source источник


Ответы (1)


В функции OnBegin InstallScript добавьте следующую строку кода InstallScript в качестве первой строки после begin:

RegDBGetItem(REGDB_UNINSTALL_DISPLAY_VERSION, IFX_INSTALLED_DISPLAY_VERSION);

Выполнение этого в OnBegin также гарантирует, что другое сообщение, не упомянутое в вопросе, использует правильный формат:

Программа установки обнаружила, что версия %VI %P уже установлена.

Эта установка устанавливает более раннюю версию %P (%VS).

Вам придется удалить предыдущую версию перед установкой этой версии.

person BlueMonkMN    schedule 23.01.2013
comment
Красивый! Меня не перестает удивлять, насколько невероятно сложными могут быть простые вещи в InstallShield. - person John Neuhaus; 11.05.2017