11.06.2009

Особенности создания ярлыков при инсталляции

Казалось бы ярлык - такая простая вещь, содается двумя-тремя кликами мышки, кроме открытия файла особо ничего не делает. Но вот чтобы создать такую простую вещь в инсталляторе написанном на Wix необходимо учитывать несколько моментов, которые в самом злостном случае способны отнять кучу времени в бесплодных поисках. В основном вся загвоздка кроется в аттрибуте Advertise тега . Опуская подробности, о ярлыках с установленным Advertise="yes" можно сказать то, что они запускают файлы, которые установлены как KeyPath для текущего компонента. KeyPath, в свою очередь определяет тот элемент, по которому определяется присутствие компонента в системе(по-умолчанию - первый файл в списке компонента). Таким образом напрашиваются несколько выводов:
- для advertised ярлыков неприменимо использование атрибута Target, которой указывает на вызываемый файл.
- для вызова нужного файла ему необходимо установить атрубут KeyPath="true" или переместить в начало списка.
- тег должен обязательно находиться в том же компоненте, что и вызываемый файл, для физического помещения ярлыка в другую папку необходимо использовать атрибут Directory.

Если все эти моменты нам не подходят и выбор падает на ярлыки с атрибутом Advertise="no", то мы просто добавляем значение атрибута Target, указывающего на нужный файл. И, в случае если ярлык и файл в одной папке где-нибудь на диске и атрибут Directory не задействован, то все будет работать отлично. Ошибки полезут, если мы ярлык пожелаем положить в какое-либо более удобное место - на рабочий стол или в меню программ, например.
Выглядеть они будут примерно так:
error LGHT0204: ICE43: Component has non-advertised shortcuts. It should use a registry key under HKCU as its KeyPath, not a file.
error LGHT0204: ICE57: Component has both per-user and per-machine data with a per-machine KeyPath.
- в случае, если мы для размещения ярлыка используем атрибут Directory.
error LGHT0204: ICE18: KeyPath for Component: is Directory: 'DesktopFolder'. The Directory/Component pair must be listed in the CreateFolders table.
error LGHT0204: ICE38: Component installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file.
error LGHT0204: ICE43: Component has non-advertised shortcuts. It should use a registry key under HKCU as its KeyPath, not a file.
- в случае, если мы размещаем тег ярлыка в новом компоненте, под директорией 'DesktopFolder'.
Выход из ситуации похоже предусмотрен только один - дать инсталлятору то, что он хочет, то есть создать элемент ветки реестра, с корнем в HKCU в том же компоненте, в котором располагается ярлык, и для элемента установить KeyPath="true".
После всех этих манипуляций ярлыки должны работать так, как им и положено.

Комментариев нет: