2012-04-19 13 views
7

Tengo el siguiente CustomAction en mi proyecto:¿Cómo puedo obtener el código de retorno de una acción personalizada?

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

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

El programa que instala el controlador produce códigos de retorno útiles, por ejemplo, si la instalación ha fallado porque el sistema necesita ser reiniciado después de un desinstalar el controlador anterior.

Actualmente, si se devuelve algo diferente al éxito, aparece un diálogo que dice 'Un programa ejecutado como parte de la configuración no finalizó como se esperaba'. y la instalación falla. Esto no es óptimo

¿Cómo puedo obtener y manejar los códigos de retorno?

+0

su totalidad diseño no es óptimo. Está fuera de proceso para Windows Installer y no es declarativo. Hay mejores patrones para instalar controladores. –

+1

@ChristopherPainter El instalador basado en Wix para este paquete debe usar las mismas herramientas que nuestros otros mecanismos de instalación, me temo que no tengo voz. – fredley

+1

Entonces no hay nada que pueda hacer por usted. Esa es simplemente la forma en que MSI maneja las llamadas EXE. Tendría que escribir sus propias acciones personalizadas para ajustar la llamada EXE e interpretar el motivo del error. Para mí esto solo agrega otro punto de falla. –

Respuesta

3

Windows Installer no admite el manejo de valores de retorno de acciones personalizadas.

Para una acción personalizada de EXE, un valor de retorno distinto de cero se interpreta como un error y la instalación se detiene. Solo una acción personalizada de win32 DLL o VBScript puede cambiar el comportamiento de la instalación a través de su return code, pero sigue siendo muy limitado.

Si desea reiniciar la máquina después de la instalación, puede establecer la propiedad REBOOT.

3

añadido como una "respuesta" por la petición:

su totalidad diseño no es óptimo. Está fuera de proceso para Windows Installer y no es declarativo. Hay mejores patrones para instalar controladores.

Así es como MSI maneja las llamadas al EXE. Tendría que escribir sus propias acciones personalizadas para ajustar la llamada EXE e interpretar el motivo del error. Para mí esto solo agrega otro punto de falla.

1

No se puede obtener un código de retorno de una acción personalizada, pero en una ronda sobre la forma en que puede establecer lo que ese código de retorno sería en una propiedad. Eso bien podría ser lo mismo que obtener el código de retorno.

Lo tiene que conseguir dentro del script/dll que está realizando su acción personalizada. De lo contrario, el código de retorno solo aparece en el registro.

Por ejemplo, si usted tiene la propiedad como

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

Luego, dentro de VBScript (o JScript) se puede obtener el valor de esa propiedad como esta:

VBScript

Session.Property("MyCode") 

Inicialmente, es nulo. Se puede establecer en VBScript como esto:

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

Una vez de vuelta en su archivo de WiX .wxs, si nos fijamos en el valor de su propiedad, que ahora es 4. Incluso se puede utilizar en las etiquetas CDATA.

Por ejemplo, sólo generar un diálogo si myCode es igual a 4.

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