Я использую настраиваемый пользовательский интерфейс WiXUI_InstallDir для установки программного обеспечения. В диалоговом окне обзора мы можем выбрать даже C:\ в качестве каталога установки. Есть ли какой-либо способ, чтобы каждый раз, когда пользователь выбирал C:\, он автоматически добавлял в него имя папки? например Если программное обеспечение является программным обеспечением XYZ, то после перехода к C:\ и нажатия OK оно должно показать c:\XYZ в pathedit.
изменить значение INSTALLFOLDER WiX
Ответы (3)
У меня иногда были клиенты, которые просили об этом в течение года, и я всегда говорил им «нет». Это не стандартная практика установщика Windows. По сути, вы пытаетесь помешать идиотам выбрать плохой каталог. Это практически невозможно, так как есть много глупых мест, где они могут разместить программное обеспечение. Если вы действительно не очень доверяете своим пользователям, откажитесь от выбора и всегда переходите в папку [ProgramFilesFolder]Моя компания\Мой продукт.
Я склонен согласиться с Крисом, отказаться от выбора и выбрать стандартный каталог установки. Вы можете избежать всевозможных проблем, а ваше программное обеспечение будет больше соответствовать стандартам.
Концепцию изменения каталога установки можно рассматривать как анти-шаблон или пережиток неудачного дизайна установщика много лет назад, когда места на диске было мало и люди устанавливали его повсюду. Установка программного обеспечения должна быть более стандартизированной, и, учитывая выбор, я блокирую установку в [ProgramFilesFolder]My Company\My Product, как предлагает Крис.
Бывают случаи, когда вы можете захотеть разрешить установку программного обеспечения на карту памяти или аналогичный носитель. В таких случаях лучше разрешить специальную установку, которая работает прямо с флешки — другими словами, это автономное приложение без зависимостей от реестра. Немногие установщики приложений поддерживают это - последний, который я видел, был Opera несколько версий назад. Совершенно другая концепция, но более значимая, чем разрешить нестандартную установку, просто изменив путь установки.
Несмотря на то, что я согласен с тем, что программное обеспечение должно быть установлено в Program Files, я пишу код, который действует так, как вы описали. В этом коде, если пользователь выберет C:\
, он будет установлен в C:\Program Files\XYZ
. Если выбрана другая корневая папка, она будет установлена, скажем, в D:\XYZ
. Вы можете расширить этот код, если хотите.
Допустим, у вас есть структура каталогов как
<Directory Id="TARGETDIR" Name="SOURCEDIR">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="XYZ" />
</Directory>
</Directory>
В коде используется PathEdit
элемент управления пользовательского интерфейса.
<Control
Id="customPathEdit"
Type="PathEdit"
Property="TARGETDIR"
Fixed="Yes"
Remote="Yes"
X="10"
Y="10"
Width="100"
Height="17">
<Publish
Property="INSTALLLOCATION"
Value="[ProgramFilesFolder]XYZ\"
Order="1"
<![CDATA[TARGETDIR << %SYSTEMDRIVE]]>
</Publish>
<Publish
Property="INSTALLLOCATION"
Value="[TARGETDIR]XYZ\"
Order="2"
<![CDATA[NOT (TARGETDIR << %SYSTEMDRIVE)]]>
</Publish>
</Control>
Конечно, нам нужен элемент управления PushButton
, чтобы сообщить установщику, что путь изменился:
<Control
Id="OkButton"
Type="PushButton"
Height="17"
Width="56"
x="50"
Y="70"
Text="OK">
<Publish
Event="SetTargetPath"
Value="INSTALLLOCATION"
Order="1">1</Publish>
<!--Another publish element is required to go to the next dialog-->
</Control>
Первый элемент публикации устанавливает для свойства INSTALLLOCATION
путь [ProgramFilesFolder]XYZ\
только в том случае, если пользователь выбрал %SYSTEMDRIVE
. Второй элемент публикации используется только в том случае, если пользователь не выбрал %SYSTEMDRIVE
. Последний элемент публикации вызывает событие SetTargetPath
, чтобы сохранить новый путь установки в сеансе установки.