Как заставить Windows Installer заменить ярлык с переименованным?
-
30-09-2019 - |
Вопрос
Недавно мы добавили функцию нашего установщика, которая требовала пару ярлыков настольных компьютеров, которые нужно незначительно переименовать (номер версии был добавлен на имя). У меня проблемы с получением установщика для замены старых ярлыков новыми. Когда проблема была первоначально сообщена, устанавливаются новые ярлыки, но старые не были удалены. После работы над проблемой у меня смешанная проблема: одна из старых ярлыков удаляется (до сих пор, так хорошо), но другой не (не так хорошо), и в обоих случаях новые ярлыки не устанавливаются (даже хуже). Я попытался изменять GUID на каждом из компонентов, которые устанавливают эти ярлыки, и я даже в одной точке попробовал изменение свойства ProductCode в каждом из модулей слияния, отвечающих за ярлыки, но ничто не получает желаемого поведение (снаружи со старым и в новом при модернизации).
Благодаря реконструкции соответствующих компонентов вот в чем отображается файл журнала для состояний установки (чтобы помочь с отладкой, я переименовал несколько компонентов, чтобы я мог сказать, какие из них из старого сборки, и которые имеют новый):
...
MSI (s) (E0:70) [16:49:21:921]: Component: DesktopFolderX.04E48C43_FFCB_42AC_AC59_1D96BEC85C17; Installed: Absent; Request: Local; Action: Local
...
MSI (s) (E0:70) [16:49:21:921]: Component: DesktopFolderX.25696C3E_819B_4675_BEE2_C36D2B5CB521; Installed: Absent; Request: Local; Action: Local
...
MSI (s) (E0:C0) [17:02:18:390]: Component: DesktopFolder.25696C3E_819B_4675_BEE2_C36D2B5CB521; Installed: Local; Request: Absent; Action: Absent
...
MSI (s) (E0:C0) [17:02:18:390]: Component: DesktopFolder.04E48C43_FFCB_42AC_AC59_1D96BEC85C17; Installed: Local; Request: Absent; Action: Null
...
Как вы можете видеть в журнале, новые ярлыки должны идти в обоих случаях, но нет. И я втересь, чтобы объяснить, почему установщик делает разные вещи с двумя старыми ярлыками.
FYI: My Dev Environment - WIGE BOCE STUDIO 7.0.
Редактировать: Я сбросил все к тому, что он был ранее, за исключением текущей продукции и продукта и продуктакода. Сделав это, установщик оставляет старые ярлыки, но не устанавливает новые. (Это другое поведение из того, что изначально сообщалось, и который я смог дублировать, то есть старые ярлыки были установлены, а новые (переименованные) были установлены также.) После перенаправления двух соответствующих компонентов установщик Удаляет старые ярлыки, но все равно не устанавливает новые. (Это то, что происходит на XP.)
Соответствующие линии в журнале после перенаправления компонентов следующие:
...
MSI (s) (80:EC) [10:48:31:091]: Component: DesktopFolder.25696C3E_819B_4675_BEE2_C36D2B5CB521; Installed: Absent; Request: Local; Action: Local
...
MSI (s) (80:EC) [10:48:31:091]: Component: DesktopFolder.04E48C43_FFCB_42AC_AC59_1D96BEC85C17; Installed: Absent; Request: Local; Action: Local
...
MSI (s) (80:0C) [11:04:22:882]: Component: DesktopFolder.25696C3E_819B_4675_BEE2_C36D2B5CB521; Installed: Local; Request: Absent; Action: Absent
...
MSI (s) (80:0C) [11:04:22:882]: Component: DesktopFolder.04E48C43_FFCB_42AC_AC59_1D96BEC85C17; Installed: Local; Request: Absent; Action: Absent
...
Первые две строки, кажется, указывают на то, что новые ярлыки устанавливаются, и все же они не являются. Ремонт после этого установят новые ярлыки.
Когда копия установщика, в которой существует исходная задача (как старые, так и новые ярлыки после обновления), может быть дублирована, является запущенным, действие, указанное в последних двух строках выше, является NULL вместо отсутствующим.
Редактировать 2: Текущее поведение заключается в том, что старые ярлыки остаются установленными, а новые не установлены. Когда я восстанавливаю свои компоненты, старые ярлыки удаляются, а новые все еще не устанавливаются. Я попробовал решения Christopher Haperer, но ни нигде не пошел. (См. Мой комментарий к этому ответу.) Должен быть способ получить новые версионные ярлыки, установленные на месте старых неверсившихся. Есть ли кто-нибудь там может обеспечить решение, которое работает?
Редактировать 3: Как оказывается, новое поведение, в котором новые ярлыки не были установлены, было связано с ошибкой, которую я сделал в получении исходных файлов, а те, которые вошли в установщик, не так, как те, что которые должны были быть заменены. Как только самые современные файлы были скомпилированы в установщик, я смог получить желаемые результаты (старые ярлыки, новые). (См. Мой ответ для получения дополнительной информации.)
Решение 2
Когда мы переосмыслием все для каждого оборота (номер сборки всегда увеличивается), это главное обновление, насколько Wi касается, поэтому, как только я получил максимальную доступ к файлам установки, регулируя компоненты, которые содержат рабочий стол Ярлыки, которые необходимы для замены, достигнуты результаты, которые я был после.
Другие советы
Ярлык - это просто файл .lnk в каталоге. Вы не переименуете ярлык, вы его удалите и создаете новый. Если вы сделаете серьезное обновление, удаление / переустройство должно обрабатывать это, но если вы выполняете второстепенное обновление, это оставит старый позади, потому что новый MSI не знает об этом.
Две возможности:
1) Используйте таблицу RemoveFile, чтобы избавиться от старого ярлыка.
2) Держите старый компонент со старым файлом и используйте переходный атрибут с условием NO-OP (Google Как удалить файл в незначительном обновлении компонента компонента AKA), чтобы привести к удалению компонента, и его файл / ярлык. Создайте новый компонент с новым именем файла и новым ярким именем для получения нового ярлыка.
Я думаю, что я попробую # 1 первым. :-)