Attualmente ho due programmi di installazione WIX per un prodotto che gestisco. Uno per i sistemi operativi a 32 bit e uno per i sistemi operativi a 64 bit. Invece di mantenere due programmi di installazione separati, desidero combinarli in un unico programma di installazione di NSIS in grado di "determinare" il "testimone" del sistema operativo e quindi copiare i binari appropriati nella directory del programma. Qualcuno ha avuto esperienza con questo e potrebbe fornire uno script di esempio che NSIS può utilizzare per creare l'installer?Utilizzare un programma di installazione NSIS per installare binari a 32 bit su sistema operativo a 32 bit e file binari a 64 bit su sistema operativo a 64 bit possibile?
risposta
x64.nsh ha alcune macro di supporto ed è possibile installare in $programfiles32
o $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
credo che ho capito ... non ho ancora testato questo, ma dovrebbe funzionare ...
La risposta è creare due "sezioni" per ciascun set di file. SEC0000
per 32 bit e SEC0001
per file a 64 bit. Poi,
!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
credo che la stessa logica sarà necessaria nella funzione un.onInit
troppo così il programma di disinstallazione sa quali file per rimuovere ...
Utilizzare le macro helper in sections.nsh per selezionare/deselezionare le sezioni ... – Anders
Per una semplice installazione universale usando 3.0a0, ho trovato con un po 'di sperimentazione che le seguenti ha lavorato per me:
!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
ho dovuto ricordarsi di mettere la funzione dopo che le sezioni di riferimento. Ciascuna delle mie sezioni faceva semplicemente riferimento a uno stesso nome .exe nelle rispettive directory a 32 bit/e 64 bit, quindi il mio programma di disinstallazione non richiedeva alcun trattamento speciale. Non l'ho testato su un sistema a 32 bit, ma ha funzionato per un sistema a 64 bit.
Esempio:
section "64-bit" SEC0001
messageBox MB_OK "64-BIT!"
File "C:\foo\64-bit\some-utility.exe"
sectionEND
per questo è necessario' ! include "Sections.nsh" 'nel tuo script poichè' SF_SELECTED' selezionato fa parte di 'Sections.nsh' – icc97
ho fatto un'occhiata a questo e mi permetterà di determinare il numero di bit del sistema operativo, ma ho ancora incontrato il problema in cui ho bisogno di dire il programma di installazione quali file da installare. Attualmente ho una "sezione" che contiene questo: 'SetOutPath $ {PROGRAMINSTALL} File/r build \\ *' Quindi non sono sicuro che il modulo x64 sarebbe d'aiuto in questa situazione ... –
Inoltre, I ' m non installando file binari a 32 bit su un sistema a 64 bit ... Sto installando file a 64 bit su sistemi operativi a 64 bit e file a 32 bit su sistemi operativi a 32 bit ... –
@JulianEasterling questo lo dice il sistema che i file da installare. Se metti file a 64-bit in 'build \ 64' e file a 32-bit in' build \ 32'. Se è anche necessario modificare la directory di installazione in base all'architettura, è possibile inserire 'SetOutPath' all'interno di If/Else – icc97