2013-07-30 47 views
8

Se il sistema operativo è a 64 bit, desidero installare una DLL a 32 bit nella cartella Program Files (x86) e nella DLL Program Files e registrarli rispettivamente. Se si tratta di un sistema operativo a 32 bit, desidero semplicemente copiare il file nella normale cartella del programma e registrarlo.Inno Setup installazione dll a 32 bit e 64 bit

Come posso farlo in Inno Setup? Anche la DLL a 64 bit verrà registrata dal programma 642 regsvr32?

Ecco il mio codice finora. Funziona bene su sistemi operativi a 32 bit, ma su sistemi operativi a 64 bit scarica entrambi i set di file nello Program Files (x86).

[Files] 
Source: D:\..\32bit files\mylibrary.dll; DestDir: {app}; \ 
    Flags: restartreplace ignoreversion regserver 32bit 

Source: D:\..\64bit files\mylibrary.dll; DestDir: {app}; \ 
    Flags: restartreplace ignoreversion regserver 64bit; Check: IsWin64 

ho guardato l'esempio 64BitTwoArch.iss ma che dice come fare un 32bit o 64bit installare non un 32bit e 64bit installazione.

+3

Se si desidera che entrambi i file siano installati su Windows a 64 bit e la cartella di destinazione sia diversa per ciascuno, non è possibile utilizzare lo stesso 'DestDir' per entrambi. Non c'è una soluzione "carina" per installarli in cartelle diverse, perché in realtà non è qualcosa che dovresti fare (e non puoi garantire che {app} sia comunque sotto {pf}). La soluzione migliore consiste nell'installare solo il file che corrisponde al sistema operativo o installarli entrambi nella stessa cartella con nomi file diversi. – Miral

+0

I second cosa dice @Miral. Potresti farlo usando una serie di brutte operazioni sulle stringhe in {app}, ma non è garantito che l'utente lo installerà in {pf} in primo luogo. – Nyerguds

risposta

2

Impossibile farlo funzionare solo con la variabile {app} perché si vuole installare su due destinazioni contemporaneamente.

risolto dal duro codifica dei file di programma cartella come questo

#define MyAppName "TestAPP" 

[Files] 
Source: D:\..\32bit files\mylibrary.dll; DestDir: {pf32}\{#MyAppName}; \ 
    Flags: restartreplace ignoreversion regserver 32bit 

Source: D:\..\64bit files\mylibrary.dll; DestDir: {pf64}\{#MyAppName}; \ 
    Flags: restartreplace ignoreversion regserver 64bit; Check: IsWin64 

Questo funziona per me. Windows carica la DLL a 32 bit per le app a 32 bit e la DLL a 64 bit per le applicazioni a 64 bit in questo modo.

+0

Viene visualizzato l'errore: "Impossibile registrare la DLL/OCX: RegSvr32 non è riuscito con il codice di uscita 0x4" quando eseguo lo script precedente. La mia ipotesi è che il mio x64 Windows non gestisca bene l'inclusione della registrazione x86. C'è un modo per gestire questo? – Chagbert

+0

Questo sembra essere un problema con la registrazione di un componente piuttosto che copiare i file.Prova a eseguire regsvr32 e il componente da solo e vedi il problema. Assicurati di utilizzare il regsvr32 a 32 bit se si tratta di una dll a 32 bit. Di default può usare il regsvr32 a 64 bit. Assicurati inoltre che il programma di installazione abbia il privilegio di amministratore corretto. https://support.microsoft.com/en-us/kb/282747 – Ali

+0

Mentre questo fa quello che la domanda richiede, generalmente la soluzione corretta è [la risposta di @ GAR8] (http://stackoverflow.com/a/ 17949964/850848). Non si desidera installare una sola DLL a 64 bit in "Programmi" a 64 bit. Lo mantieni con il resto dei binari per la tua (presumibilmente) applicazione a 32 bit. –

4

Ho avuto successo con il seguente:

[Files] 
Source: D:\..\32bit files\mylibrary.dll; DestDir: {app}; \ 
    Flags: restartreplace ignoreversion regserver 32bit; **Check: "not IsWin64"** 

Source: D:\..\64bit files\mylibrary.dll; DestDir: {app}; \ 
    Flags: restartreplace ignoreversion regserver 64bit; Check: IsWin64 
+0

il destdir è {app} per entrambi. Non sarebbe copiare entrambi i 64 e 32 bit nella stessa posizione allora? Mi piacerebbe che il 64 bit fosse copiato nella posizione dei file di programma a 64 bit e 32 bit nei file di programma x86. – Ali

+0

No, copierà solo la versione che corrisponde al bit del sistema. Aiuto di In Inno: "Fa sì che la costante di {sys} si associ alla directory di sistema a 64 bit quando viene utilizzata nei parametri Filename e WorkingDir.Questo è il comportamento predefinito in un'installazione in modalità a 64 bit. Questo flag può essere utilizzato solo quando L'installazione è in esecuzione su Windows a 64 bit, altrimenti si verificherà un errore. In un'installazione che supporta architetture sia a 32 che a 64 bit, è possibile evitare l'errore aggiungendo un parametro Check: IsWin64, che causerà l'immissione della voce saltato silenziosamente durante l'esecuzione su Windows a 32 bit. " – GAR8

+0

Questo non risponde alla domanda, poiché in effetti installa entrambi i file nella stessa posizione (l''{app} 'si risolve nella cartella di installazione selezionata dall'utente, non verrà mappata magicamente a 64-bit equivalenti quando la flag' 64bit' è Usato). D'altra parte, questa è la soluzione corretta per la maggior parte dei casi. Ad esempio, se l'applicazione è a 32 bit, ma ha anche l'estensione della shell della versione a 64 bit, si installa ancora l'estensione della shell insieme al resto dei binari ai "Program Files" a 32 bit. Ma tu usi il flag '64bit' per farlo registrare a 64-bit. –

Problemi correlati