Inno Setup 7 получила 64-разрядные компиляторы и установщики.
Обе версии Inno Setup 7 могут создавать 32-разрядные или 64-разрядные
установщики, их можно устанавливать параллельно и они могут сосуществовать
вместе с Inno Setup 6.
Было уделено большое внимание обеспечению максимальной обратной
совместимости с Inno Setup 6, а также совместимости между 32-разрядными и
64-разрядными установщиками.
64-разрядные установщики
В обеих версиях по умолчанию используется создание 32-разрядных установщиков.
Чтобы создать 64-разрядный установщик вместо 32-разрядного, установите в
секции [Setup] для директивы SetupArchitecture
значение x64. Это также изменит значения директив ArchitecturesAllowed
и ArchitecturesInstallIn64BitMode
на x64compatible, в результате чего 64-разрядные установщики по
умолчанию будут работать в 64-разрядном
режиме установки.
Основные преимущества и отличия:
- 64-разрядные установщики позволяют использовать максимальный размер
словаря для методов сжатия lzma и lzma2 в 3,8 ГБ вместо
1 ГБ. Перед использованием больших размеров словаря ознакомьтесь с
требованиями к памяти, указанными в разделе справки Compression.
- В 64-разрядных установщиках по умолчанию включена функция ASLR с высокой
энтропией. Это помогает соответствовать корпоративным политикам или
требованиям сторонних организаций, предписывающим использование 64-разрядных
исполняемых файлов.
- 64-разрядные установщики полностью поддерживают 32-разрядный режим установки и наоборот.
Чтобы использовать 64-разрядный установщик, оставаясь в 32-разрядном режиме
установки (например, потому что вы непреднамеренно развертывали 64-разрядные
приложения в 32-разрядном режиме), установите для директивы
ArchitecturesInstallIn64BitMode пустое значение, что переопределит
значение по умолчанию.
- Существующие инсталляторы, выполненные 32-разрядными программами установки,
могут быть без проблем обновлены 64-разрядными программами установки и
наоборот.
- Особенности 64-разрядного программирования на языке Паскаль:
- В 32-разрядных установщиках тип Extended имеет размер 10 байт,
тогда как в 64-разрядных установщиках он занимает 8 байт и является лишь
псевдонимом типа Double.
- В 32-разрядных установщиках типы NativeInt и NativeUInt
имеют размер 4 байта, тогда как в 64-разрядных установщиках — 8 байт. То
же относится ко всем производным от них типам, например HWND.
В примере CodeDll.iss демонстрируется, как реализовать поддержку
32- и 64-разрядных установщиков в одном сценарии.
Обратите внимание: хотя такие типы, как HWND, в 64-разрядных
процессах имеют размер 8 байт (64 бита), в
64-разрядной Windows для совместимости используются 32-разрядные значения
дескрипторов
.
При передаче дескриптора между 32- и 64-разрядными приложениями значимыми
являются только младшие 32 бита, поэтому допустимо усечение с 64 до 32 бит
или знаковое расширение с 32 до 64 бит.
- Как в 32-разрядных, так и в 64-разрядных установщиках структурные
типы данных record (записи) в контексте программирования на
языке Паскаль всегда являются "упакованными" (packed). При вызове функции
Windows API или внешней DLL, которая ожидает выровненные записи, может
потребоваться вручную добавить заполнители для обеспечения правильного
выравнивания полей в памяти. Даже если 32-пазрядному установщику этого
не требовалось, для 64-разрядного установщика это является обязательным
из-за различий в правилах выравнивания и размерах полей.
- Невозможно загрузить 32-разрядные DLL в 64-разрядных установщиках,
так как Windows не разрешает 64-разрядным процессам загружать 32-разрядные
DLL (и наоборот). Однако всегда можно запускать как 32-разрядные, так и
64-разрядные EXE-файлы с помощью функции Exec или через секцию
[Run].
- В 32-разрядных установщиках параметры обратного вызова CreateCallback, передаваемые
по значению, не поддерживаются, если их тип превышает 4 байта, например,
Int64, Double, Extended и Currency.
64-разрядные установщики не имеют такого ограничения.
- 64-разрядные библиотеки COM-интерфейсов (.tlb) теперь могут быть
зарегистрированы или удалены только 64-разрядными установщиками, 32-разрядные
библиотеки – только 32-разрядными установщиками.
Регистрация и удаление 64-разрядных библиотек из 32-разрядных установщиков
больше не поддерживается.
- Константа {sysnative} недоступна 64-разрядным установщикам или
любым другим 64-разрядным приложениям, поэтому её значение следует использовать
только, например, для передачи 32-разрядному приложению.
- В наших тестах на "Windows Server 2016 Datacenter Server Core" и "Windows
Server 2025 Datacenter: Azure Edition Core" со всеми функциями WOW64,
отключенными и удаленными с помощью DISM, 64-разрядные установщики по-прежнему
работают корректно, даже при запуске в 32-разрядном режиме установки.
64-разрядные IDE компилятора и ISCC
Чтобы использовать 64-разрядные версии IDE компилятора и ISCC, установите
64-разрядную версию Inno Setup 7. Обе версии одинаково читают сценарии,
используют одни и те же настройки и могут компилировать 32- и 64-разрядные
установщики.
Чтобы узнать, какую версию вы установили, запустите IDE компилятор сценариев.
32-разрядная версия в строке заголовка будет иметь надпись "32-bit", а
64-разрядная нет.
Рекомендуется использовать 64-разрядную версию.
Основные преимущества и отличия:
- Любая из версий может собирать установщики любой архитектуры: 32-разрядные
компиляторы могут создавать 64-разрядные установщики и наоборот.
- Обе версии могут быть установлены параллельно и включают в себя одинаковые
примеры и файлы справки.
- 64-разрядные компиляторы, как правило, обеспечивают более быстрое сжатие
LZMA при полной совместимости с существующими сценариями.
В Windows 11 на базе Arm64 они используют двоичный файл ARM64EC
(islzma-Arm64EC.dll) для обеспечения родной (native)
производительности.
- Директива LZMAUseSeparateProcess в секции [Setup]
64-разрядными компиляторами игнорируется, поскольку 64-разрядные процессы
могут напрямую выделять больше памяти, что устраняет необходимость в
использовании отдельного процесса сжатия.