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

Использовать один установщик NSIS для установки 32-разрядных двоичных файлов в 32-разрядной ОС и 64-битных двоичных файлов в 64-битной ОС?

В настоящее время у меня есть два установщика WIX для продукта, который я поддерживаю. Один для 32-разрядных операционных систем и один для 64-разрядных операционных систем. Вместо того, чтобы поддерживать два отдельных установщика, я хочу объединить их в один установщик NSIS, который может "определить" "битность" ОС, а затем скопировать соответствующие двоичные файлы в каталог программы. Кто-нибудь имел какой-либо опыт с этим и мог предоставить рабочий образец script, который NSIS может использовать для установки установщика?

4b9b3361

Ответ 1

x64.nsh содержит вспомогательные макросы, и вы можете установить их в $programfiles32 или $programfiles64

Edit:

Function .onInit
StrCpy $instdir $programfiles32\MyApp
${If} ${RunningX64}
  StrCpy $instdir $programfiles64\MyApp
${EndIf}
FunctionEnd

...

Section
Setoutpath $instdir
${If} ${RunningX64}
  File /r build\64\*
${Else}
  File /r build\32\*
${EndIf}
SectionEnd

Ответ 2

Я считаю, что понял это... Я еще не тестировал это, но он должен работать...

Ответ заключается в создании двух "разделов" для каждого набора файлов. SEC0000 для 32-разрядных и SEC0001 для 64-битных файлов. Тогда,

!include x64.nsh

Function .onInit
  #Determine the bitness of the OS and enable the correct section
  ${if} ${RunningX64}
    SectionSetFlags ${SEC0001} 17
    SectionSetFlags ${SEC0000} 16
  ${else}
    SectionSetFlags ${SEC0001} 16
    SectionSetFlags ${SEC0000} 17
  ${endif}
FunctionEnd

Я считаю, что в функции un.onInit потребуется такая же логика, чтобы Uninstaller знал, какие файлы удалить...

Ответ 3

Для простого универсального установщика, использующего 3.0a0, я нашел с небольшим экспериментом, что для меня работало следующее:

!include x64.nsh
Function .onInit
  #Determine the bitness of the OS and enable the correct section
  ${If} ${RunningX64}
    SectionSetFlags ${SEC0000}  ${SECTION_OFF}
    SectionSetFlags ${SEC0001}  ${SF_SELECTED}
  ${Else}
    SectionSetFlags ${SEC0001}  ${SECTION_OFF}
    SectionSetFlags ${SEC0000}  ${SF_SELECTED}
  ${EndIf}
FunctionEnd

Мне просто нужно было запомнить функцию после ссылочных разделов. Каждый из моих разделов просто ссылался на одноименный .exe в своих 32-битных/64-битных/каталогах, поэтому мой деинсталлятор не нуждался в специальной обработке. Я не тестировал его на 32-битной системе, но он работал для 64-разрядной системы.

Пример:

section "64-bit" SEC0001
  messageBox MB_OK "64-BIT!"
  File "C:\foo\64-bit\some-utility.exe"
sectionEND