Подтвердить что ты не робот

WiX: предотвратите запуск 32-разрядного установщика на 64-битной Windows

Из-за путаницы пользователя для нашего приложения требуются отдельные установщики для 32-разрядных и 64-разрядных версий Windows. Хотя 32-разрядный установщик отлично работает на win64, он может создавать головные боли поддержки, и мы хотели бы предотвратить это.

Я хочу, чтобы 32-разрядный установщик MSI не запускался на 64-разрядных машинах Windows. Для этого у меня есть следующее условие:

<Condition Message="You are attempting to run the 32-bit installer on a 64-bit version of Windows.">
  <![CDATA[Msix64 AND (NOT Win64)]]>
</Condition>

С Win64 определяется следующим образом:

<?if $(var.Platform) = "x64"?>
<?define PlatformString = "64-bit"?>
<?define Win64 ?>
<?else?>
<?define PlatformString = "32-bit"?>
<?endif?>

Дело в том, что я не могу заставить эту проверку работать правильно. Либо он срабатывает постоянно, либо ни разу. Цель состоит в том, чтобы проверить наличие переменной времени выполнения msix64 по переменной Win64 времени компиляции и выбросить ошибку, если они не совпадают, но логика не работает, как я ее намерен. Кто-нибудь придумал лучшее решение?

4b9b3361

Ответ 1

Включить элемент "Условие" только в ваш 32-разрядный пакет (т.е. используя оператор "if" preprocessor). Условие будет "НЕ Msix64": условия запуска - это вещи, которые должны быть истинными, поэтому, если установлен Msix64, условие запуска завершится неудачно, и это означает, что это x64-ОС и 32-разрядный пакет, и правильная вещь, которую нужно сделать, - это блок.

Ответ 2

Мы используем следующее...

<?if $(var.ProcessorArchitecture)=x86 ?>
<Condition Message="!(loc.LaunchCondition_Error64)">
    <![CDATA[Installed OR Not VersionNT64]]>
</Condition>
<?endif?>

Ответ 3

Элемент условия работает со свойствами установщика Windows, которые существуют во время установки.

Однако вы определяете Win64 как переменную wix, а не свойство установщика Windows. Переменные Wix существуют только при создании установки. Вы должны ссылаться на них как $(var.MyWixVariable), где вы их используете, а препроцессор wix затем заменит их на их определенное значение.

Вместо этого я попробую:

<?if $(var.Platform) = "x64"?>
<?define PlatformString = "64-bit"?>
<Property Id="Win64" Value="1" />
<?else?>
<?define PlatformString = "32-bit"?>
<?endif?>

Если $(var.Platform) имеет правильное значение при создании установки, это приведет к тому, что свойство "Win64" будет записано в базу данных установщика Windows (то есть файл MSI), и свойство будет доступно во время установки для использования в элементе условия.

Ответ 4

Добавьте это условие

<Condition Message="This is designed for 32bit OS">%PROCESSOR_ARCHITECTURE ~= "x86" AND %PROCESSOR_ARCHITEW6432 &lt;&gt; "amd64"></Condition>

Вы можете создать один установщик с 32-битным компонентом и 64-битным компонентом и поместить эти два условия в соответствующие компоненты

<Component Id="bit32Component" Guid="..." Feature="ProductFeature">
    <Condition>%PROCESSOR_ARCHITECTURE~="x86" AND %PROCESSOR_ARCHITEW6432&lt;&gt;"amd64"></Condition>
</Component>
<Component Id="bit64Component" Guid="..." Feature="ProductFeature">
    <Condition>%PROCESSOR_ARCHITECTURE~="amd64" OR %PROCESSOR_ARCHITEW6432~="amd64"></Condition>
</Component>

вот ссылка, которую я использовал

http://blogs.msdn.com/david.wang/archive/2006/03/26/HOWTO-Detect-Process-Bitness.aspx