Приложение изначально было доставлено в 32-битной форме. Теперь он распространяется с 32- и 64-битной версией.
Теперь, когда пользователь в 64-битной Windows обновляет приложение с 32-битной версии до 64-битной версии, папка установки по умолчанию должна указывать на «Program files» (без x86).
Я обновил мои wsx
файлы таким образом:
<?if $(var.Platform) = x64 ?>
<?define bitness = "(64 bit)" ?>
<?define Win64 = "yes" ?>
<?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
<?else ?>
<?define bitness = "(32 bit)" ?>
<?define Win64 = "no" ?>
<?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
<?endif ?>
....
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PlatformProgramFilesFolder)">
<Directory Name="COMPANY" Id="D.COMPANY">
<Directory Name="Product name" Id="APPDIR">
</Directory>
</Directory>
</Directory>
</Directory>
И это прекрасно работает для новых установок:
Когда 32-битное приложение установлено в 64-битной системе, оно устанавливается в «Program files x86», а во всех остальных случаях установка выполняется в «Program files».
В случае обновления с 32-х до 64-битных папкой назначения по умолчанию по-прежнему остается «Program files x86», и мне нравится, если она перемещается в «Program Files».
Есть ли хороший способ сделать это? Или мне нужно переопределить это какое-то настраиваемое действие в моем коде C ++?
Редактировать / Update
Просто быть чистым. Мое приложение является фоновым сервисом. Пользователь машины вообще не видит это приложение (за исключением крайних угловых случаев). В большинстве случаев эта служба устанавливается / не обновляется другой службой, которая может в удаленном режиме и удаленно устанавливать необходимое программное обеспечение.
Во время этого обновления все 32-битные компоненты очищаются (один exe и пара dll-ов) и заменяются 64-битными эквивалентами. Данные конфигурации и кэшированные данные передаются в обновленное приложение.
RemoveExistingProducts
установлено на <RemoveExistingProducts After="InstallInitialize" />