2012-03-08 4 views
7

Usando innosetup y quiero mostrar el error/msgbox si uno del proceso [RUN] no devuelve el código de proceso 0. Lo estoy usando para autorización proceso, si la autorización no es exitosa, quiero notificar al usuario.Usando el código de salida del proceso para mostrar un mensaje de error para un archivo específico en [Ejecutar]

He siguientes:

Filename: "{pf32}\Common Files\Authorization.exe"; Parameters: " "{code:GetAuthorizationFilePath}" /s"; WorkingDir: "{tmp}"; Flags: skipifdoesntexist hidewizard; StatusMsg: "Authorizing License"; 

Me Devuelve:

Process exit code:0 

0, por supuesto, es un éxito, pero si no es 0 quiero para notificar al usuario.

¿Hay alguna manera de hacerlo?

Gracias y Saludos, Kev84

+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 [Inno Setup: Cómo Abortar/¿Terminar la configuración durante la instalación?] (Http://stackoverflow.com/q/6345920/850848) –

Respuesta

7

creo que no hay manera de lograr esto de la sección [Run]. Lo que puede hacer es:

  • utilizar la secuencia de comandos Pascal para esta tarea
  • o mostrar el mensaje de error modal de la aplicación ejecutada Authorization.exe y terminar sólo después de que el usuario confirme el mensaje de error (configuración continuará luego por ejemplo, con la ejecución de los otros archivos en la sección [Run])

Aquí está el ejemplo de código de Pascal Script; También se puede comprobar la commented version de este código:

[Code] 

function NextButtonClick(CurPageID: Integer): Boolean; 
var 
    ResultCode: Integer; 
begin 
    Result := True; 

    if CurPageID = wpWelcome then 
    begin 
    Result := False; 
    if Exec(ExpandConstant('{pf32}\Common Files\Authorization.exe'), '', '', 
     SW_SHOW, ewWaitUntilTerminated, ResultCode) then 
    begin 
     if ResultCode = 0 then  
     Result := True 
     else 
     MsgBox('The authorization failed!', mbCriticalError, MB_OK); 
    end; 
    end; 
end; 
+0

Entonces, ¿tengo que crear mi propia función en esa entrada [Ejecutar]? Si es así, ¿a dónde llamo esa función? ¿Hay alguna manera de ejecutar el método después de que el proceso finalice? Si es así, ¿cómo obtengo el código de proceso/error? – Kev84

+0

Perdón por llegar demasiado tarde; Estoy bastante seguro de que ha resuelto esto por su cuenta, pero aún así ... He agregado el ejemplo del código PascalScript junto con la ['comentada versión'] (http://stackoverflow.com/revisions/9621406/ 2). – TLama

+1

Si reemplaza una entrada '[Ejecutar] ', configurar este código en' WpWelcome' no parece una buena idea. Personalmente usaría la función 'CurStepChanged', en' CurStep = ssPostInstall'. – Nyerguds

3

que tenía los mismos requisitos: para ejecutar un programa externo y mostrar un mensaje de error si el código de retorno no es 0. Fue muy importante para mí para ejecutar el programa en la sección Run ya que necesitaba mostrar un mensaje de estado y la barra de progreso es agradable de tener.

He encontrado que se puede utilizar AfterInstall en la sección Run para desencadenar la ejecución de su programa y comprobar el código de resultado (ver this link para obtener más información sobre AfterInstall.)

Por lo tanto, mi idea era correr un maniquí programa como change y para usar el procedimiento especificado en AfterInstall para ejecutar el programa real y capturar su código de resultado.

[Code] 
procedure ExecuteRealProgram(); 
var 
    ResultCode: Integer; 
begin 
    if Exec(ExpandConstant('{pf32}\Common Files\Authorization.exe'), '', '', SW_SHOW, 
      ewWaitUntilTerminated, ResultCode) 
    then begin 
     if not (ResultCode = 0) then 
      MsgBox('Error! ResultCode is ' + IntToStr(ResultCode), mbCriticalError, MB_OK); 
    end 
    else 
     MsgBox('Exec failed! Error: ' + SysErrorMessage(ResultCode), mbCriticalError, MB_OK); 
    end; 
end; 
[Run] 
Filename: "change.exe"; WorkingDir: "{tmp}"; \ 
    StatusMsg: "Running external program. Please wait."; AfterInstall: ExecuteRealProgram 
Cuestiones relacionadas