2011-06-14 25 views
17

Durante mi instalación, ejecuto un archivo bat. Si el archivo bat devuelve un error, necesito abortar/terminar la configuración. Me gustaría que haga un MsgBox diciendo al usuario lo que sucedió, luego para que el aborto se vea y actúe como si el usuario presiona el botón Cancelar.Inno Setup: ¿Cómo abortar/finalizar la configuración durante la instalación?

¿Es posible cancelar/finalizar la configuración?

Los ejemplos de código serían realmente apreciados.

[Run] 
Filename: {tmp}\test.bat; WorkingDir: {tmp}; Flags: waituntilterminated runhidden 
+0

Véase también [Cómo forzar instalación Inno Setup a fallar cuando el comando Ejecutar falla?] (Http://stackoverflow.com/q/1122588/850848) y [Usando código de salida de proceso para mostrar mensaje de error para un archivo específico en \ [Run \]] (http://stackoverflow.com/q/9621099/850848) –

+0

véase también [Salir de Inno Instalación y Configuración de \ [\ code]] (https://stackoverflow.com/q/4438506/ 850848 # 39788977). –

Respuesta

10

El problema es que [Run] se produce después de que el proceso de instalación se complete correctamente. Para que no pueda cancelar en este momento, solo puede desinstalar. También [Run] no le permite obtener el código de salida.

Así que tiene algunas opciones.

Uso Evento: procedure CurStepChanged(CurStep: TSetupStep);

Y la llamada del {tmp}\test.bat usando Exec o ExecAsOriginalUser ambos devuelven el ResultCode. Luego puede solicitar al usuario que desinstale.

Sin embargo, creo que realizar una cancelación sería más fácil.

Para hacer eso, cree un evento AfterInstall en el último archivo de su proyecto. Y ejecuta el programa desde este evento, ya que puedes cancelar desde este evento.

Aquí hay un código de muestra que muestra cómo se podría hacer.

[Files] 
Source: "MYPROG.EXE"; DestDir: "{app}"; AfterInstall: MyAfterInstall 

[Code] 
procedure MyAfterInstall(); 
var 
ResCode : Integer; 
begin 
if Exec(ExpandConstant('{tmp}') + '\test.bat', 
     '', SW_HIDE, ewWaitUntilTerminated, ResCode) then 
begin 
    { Program Ran successfully ResCode now contains exit code results } 

    { if Exit was 10 then Cancel Installation. } 
    if ResCode = 10 then 
    begin 
     WizardForm.Close; 
    end;  
end 
else 
begin 
    { Problem running Program } 
    MsgBox('Error', SysErrorMessage(ResCode), mbError, MB_OK); 
end; 

end; 
+0

Gracias. Esto era exactamente lo que estaba buscando. – PM2

+1

"WizardForm.Close" muestra un "sí/no" de diálogo para preguntar al usuario si desea cancelar, i no cualquier otro código que obligan a la realización de cancelar? –

25

Gracias, Robert. Es un problema común que ocurre en cualquier momento cuando el script detecta que la instalación no se puede continuar. Sin embargo, hay un problema en su solución. WizardForm.Close invoca el diálogo cancelar, y la instalación se detiene solo si el usuario responde "Sí". Para salir definitivamente, debemos invocar CancelButtonClick.

[Files] 
Source: "MYPROG.EXE"; DestDir: "{app}"; AfterInstall: MyAfterInstall 

[Code] 
var CancelWithoutPrompt: boolean; 

function InitializeSetup(): Boolean; 
begin 
    CancelWithoutPrompt := false; 
    result := true; 
end; 

procedure MyAfterInstall(); 
begin 
    (Do something) 
    if BadResult then begin 
    MsgBox('Should cancel because...',mbError,MB_OK) 
    CancelWithoutPrompt := true; 
    WizardForm.Close; 
    end; 
end; 

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean); 
begin 
    if CurPageID=wpInstalling then 
    Confirm := not CancelWithoutPrompt; 
end; 
+0

que estaba buscando para ello, así que gracias por este comentario! – BenDev

1

he utilizado un código de respuestas aquí para componer complete solution para ejecutar comandos de forma segura en la sección [Ejecutar] con la debida notificación y rollback en caso de error.

2

Sólo para completar las otras posibilidades:

Si se puede comprobar la condición previa antes de recoger cualquier información del usuario, entonces el mejor lugar para hacer el cheque está en una función InitializeSetup. Esto le permite mostrar un MsgBox y luego salir con Result := False para cancelar la instalación.

Si es necesario reunir alguna información del usuario en primer lugar (como el directorio de instalación), pero todavía se puede comprobar el estado sin necesidad de instalar ningún archivo (aparte de quizás unos pocos a través de ExtractTemporaryFile), entonces el mejor lugar es en el PrepareToInstall función. Esto le permite mostrar un mensaje de error (devolviéndolo), en cuyo caso el usuario puede retroceder y corregir algo, o salir de la instalación.

Si la condición que está comprobando se relaciona específicamente con la selección del usuario en una página en particular (de nuevo, como el directorio de destino), y puede hacer el control rápidamente y sin alterar el sistema del usuario, entonces es mejor de manejar que en NextButtonClick; se puede visualizar un MsgBox con el error y volver False para evitar pasar a la página siguiente.

Si tiene que esperar hasta después de instalar todo lo demás, entonces es demasiado tarde para salir de la instalación, pero si desea hacerlo de todos modos, entonces la respuesta de Robert será suficiente.

Cuestiones relacionadas