2012-04-19 15 views
7

Ho il seguente CustomAction nel mio progetto:Come posso ottenere il codice di ritorno da CustomAction?

<CustomAction Id="InstallDriver" 
        Return="check" 
        Execute="deferred" 
        Impersonate="no" 
        FileKey="FileDriverInst" 
        ExeCommand="-install" /> 

<InstallExecuteSequence> 
    <Custom Action="InstallDriver" Before="InstallServices" /> 
</InstallExecuteSequence> 

Il programma che installa il driver produce codici di ritorno utili, ad esempio, se l'installazione non è riuscita perché il sistema deve essere riavviato a seguito di una precedente disinstallazione del driver.

Attualmente se viene restituito qualcosa di diverso dal successo, viene visualizzata una finestra di dialogo che dice "Un programma eseguito come parte dell'impostazione non è terminato come previsto." e l'installazione fallisce. Questo non è ottimale.

Come posso ottenere e gestire i codici di ritorno?

+0

vostro intero disegno non è ottimale. È fuori processo per Windows Installer e non è dichiarativo. Esistono modelli migliori per l'installazione dei driver. –

+1

@ChristopherPainter Il programma di installazione basato su Wix per questo pacchetto deve utilizzare gli stessi strumenti dei nostri altri meccanismi di installazione, temo di non avere voce in capitolo. – fredley

+1

Quindi non c'è niente che io possa fare per te. Questo è semplicemente il modo in cui MSI gestisce le chiamate EXE. Dovresti scrivere le tue azioni personalizzate per avvolgere la chiamata EXE e quindi interpretare il motivo dell'errore. Per me questo aggiunge solo un altro punto di fallimento. –

risposta

3

Windows Installer non supporta la gestione dei valori di ritorno delle azioni personalizzate.

Per un'azione personalizzata EXE un valore di ritorno diverso da zero viene interpretato come un errore e l'installazione si interrompe. Solo un'azione Win32 DLL o VBScript personalizzata può modificare il comportamento dell'installazione tramite il suo return code, ma è ancora molto limitato.

Se si desidera riavviare la macchina dopo l'installazione, è possibile impostare la proprietà REBOOT.

3

Aggiunto come "risposta" su richiesta:

L'intero progetto non è ottimale. È fuori processo per Windows Installer e non è dichiarativo. Esistono modelli migliori per l'installazione dei driver.

Questo è semplicemente il modo in cui MSI gestisce le chiamate EXE. Dovresti scrivere le tue azioni personalizzate per avvolgere la chiamata EXE e quindi interpretare il motivo dell'errore. Per me questo aggiunge solo un altro punto di fallimento.

1

Non è possibile ottenere un codice di ritorno da un'azione personalizzata, ma in un modo approssimativo è possibile impostare il codice restituito su una proprietà. Potrebbe anche essere la stessa cosa ottenere il codice di ritorno.

Devi farlo all'interno dello script/dll che l'azione personalizzata sta eseguendo. Altrimenti, il codice di ritorno appare solo nel registro.

Ad esempio, se si dispone di proprietà come

<Property="MyCode" Secure="yes"> 

Poi all'interno di VBScript (o JScript) è possibile ottenere il valore di tale proprietà come questa:

VBScript

Session.Property("MyCode") 

Inizialmente, è nullo. È possibile impostare in VBScript in questo modo:

If someCondition = 4 Then 
    Session.Property("MyCode") = "4" // For a return code of 4 
End If 

Una volta tornati nel vostro file WiX .wxs, se si guarda al valore della vostra proprietà, ora è 4. Si potrebbe anche utilizzarlo nei tag CDATA.

Per esempio, deporre le uova solo finestra di dialogo se mycode è pari a 4.

<Publish Dialog="SpawnDialog" ...><![CDATA[ MyCode = 4 ]]></Publish>