Вопрос

У меня есть проект InstallScript, написанный с нуля в InstallShield 2010.Он содержит, среди прочего, три собственных объекта InstallShield и четыре объекта-держателя модуля слияния InstallShield, которые обертывают файлы MSM.

Когда я первоначально тестировал проект, он нормально установился в чистой среде, но когда я попытался выполнить обновление до более новой версии, каждый из четырех объектов-держателей модулей слияния выдал ошибку «Ошибка 1706.Для сообщения о продукте XXXX не найден действительный источник.

Я немного покопался в сети и обнаружил, что это ошибка установщика Windows, и она возникает потому, что файл MSI должен существовать на компьютере даже после того, как исходный установочный носитель исчез.Рекомендуемый способ убедиться в этом — установить флажок «Кэшировать пакет MSI локально» в диалоговом окне свойств объекта держателя модуля «Объединить».

Я отметил этот флажок для всех четырех модулей слияния и повторно протестировал, но это не решило проблему.Затем я посмотрел, где на самом деле размещаются эти модули слияния на жестком диске.В диалоге с недвижимостью говорилось <DISK1TARGET>, что разрешает C:\Program Files\InstallShield Installation Information\{GUID продукта} во время выполнения.Глядя на тестовую машину, казалось, что все четыре модуля слияния записывают данные в одно и то же место, тем самым перезаписывая файлы MSI друг друга.

Чтобы обойти это, я отредактировал каждый модуль слияния, чтобы он кэшировал себя по уникальному пути. <DISK1TARGET>\{Имя}.Я снова скомпилировал и протестировал и вижу, что каждый модуль слияния теперь действительно сохраняется в уникальной подпапке.Однако все четыре сообщения об ошибке 1706 все еще появляется при обновлении.

У кого-нибудь есть идеи?Я уверен, что упускаю что-то очевидное, но это нигде не задокументировано.:-)

ОБНОВЛЯТЬ:

Судя по многочисленным сообщениям на форумах InstallShield, похоже, что InstallShield генерирует совершенно новый GUID продукта для каждого встроенного MSI каждый раз, когда он создает проект InstallScript.В процессе обновления механизм InstallShield перезаписывает каждый файл MSI, кэшированный на целевом компьютере, более новой версией, но когда дело доходит до их выполнения, установщик Windows говорит: «Эй, это новый продукт, где MSI старого продукта, чтобы я мог можно удалить его?", отсюда и ошибка.

Можно ли указать InstallShield не генерировать повторно GUID продукта для каждого встроенного MSI в каждой сборке?Неужели такое поведение представляет собой насмешку над самой идеей встраивания модулей слияния в проекты InstallScript?:-(

Это было полезно?

Решение

Я получил эту работу:

  1. Получение автономных настроек MSI, соответствующих уже имеющимся у нас MSM.К счастью, это было возможно для всех.
  2. Включение MSI в качестве устанавливаемых компонентов в проект InstallScript, установленных в подходящее временное расположение на целевом объекте.
  3. В соответствующем <feature>_Installed мероприятие, раскошелиться на msiexec.exe и запустите файл MSI с помощью /i и /qb переключатели.
  4. В соответствующем <feature>_UnInstalling мероприятие, раскошелиться на msiexec.exe и запустите файл MSI с помощью /x выключатель.

Это кажется немного «неправильным», но работает очень хорошо, поэтому я рад оставить все как есть, если у кого-то нет идей получше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top