2008-12-11 16 views
9

¿Alternativamente es posible actualizar manualmente la barra de progreso incorporada? Básicamente tengo 2 MSI incluidas y el uso de Inno Setup como iniciador, y dependiendo de la entrada del usuario, se instalarán una o ambas MSI. Tengo algo que funciona utilizando instrucciones Exec en CurStepChanged pero no actualiza la barra de progreso a medida que se extraen los archivos y parece que el instalador está atascado. Supongo que el resultado final es que quiero algunas actualizaciones de la barra de progreso mientras los archivos se extraen a la carpeta temporal. La siguiente es mi código actual:En Inno Setup, ¿es posible agregar sentencias condicionales a lo que se ejecuta en la sección [Ejecutar]?

procedure CurStepChanged(CurStep: TSetupStep); 
var 
    ResultCode: Integer; 
begin 
    if(CurStep = ssInstall) then begin 
     if(InstallServer) then begin 
      ExtractTemporaryFile('ServerSetup.msi'); 
      Exec('msiexec',ExpandConstant('/i "{tmp}\ServerSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Server\" ALLUSERS=2'),'', SW_SHOW, ewWaitUntilTerminated, ResultCode); 
     end; 
     if(InstallClient) then begin 
      ExtractTemporaryFile('ClientSetup.msi'); 
      Exec('msiexec',ExpandConstant('/i "{tmp}\ClientSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Client\" ALLUSERS=2'),'', SW_SHOW, ewWaitUntilTerminated, ResultCode); 
     end; 
    end; 
end; 

Respuesta

24

Por qué no simplemente intentar algo como esto:

[Files] 
Source: ClientSetup.msi; DestDir: {tmp}; Flags: deleteafterinstall; Components: Client 
Source: ServerSetup.msi; DestDir: {tmp}; Flags: deleteafterinstall; Components: Server 

[Run] 
Filename: msiexec.exe; Parameters: /i "{tmp}\ClientSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Client\" ALLUSERS=2; WorkingDir: {tmp}; StatusMsg: Installing client; Components: Client 
Filename: msiexec.exe; Parameters: /i "{tmp}\ServerSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Server\" ALLUSERS=2; WorkingDir: {tmp}; StatusMsg: Installing server; Components: Server 

[Components] 
Name: Client; Description: Client Installation 
Name: Server; Description: Server Installation 

Por supuesto que no necesariamente tiene que usar Components. No escribió cómo decide qué instalador ejecutar. Si necesita una lógica más compleja también se podría utilizar Check functions como en:

[Files] 
Source: ClientSetup.msi; DestDir: {tmp}; Flags: deleteafterinstall; Check: CheckClient 
Source: ServerSetup.msi; DestDir: {tmp}; Flags: deleteafterinstall; Check: CheckServer 

[Run] 
Filename: msiexec.exe; Parameters: /i "{tmp}\ClientSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Client\" ALLUSERS=2; WorkingDir: {tmp}; StatusMsg: Installing client; Check: CheckClient 
Filename: msiexec.exe; Parameters: /i "{tmp}\ServerSetup.msi" /qb INSTALLDIR="{code:GetInstallPath}\Server\" ALLUSERS=2; WorkingDir: {tmp}; StatusMsg: Installing server; Check: CheckServer 

[Code] 
function CheckClient: Boolean; 
begin 
    Result := WhateverCondition; 
end; 

function CheckServer: Boolean; 
begin 
    Result := WhateverOtherCondition; 
end; 
+0

creo que el cheque: es lo que necesitaba saber. No vi nada al respecto en el archivo de ayuda de Inno Setup (que sorprendentemente ha sido bastante útil) y no era una opción en la guía de ISTool. +1 ahora y aceptado si funciona :) – Davy8

+1

He vinculado a la sección correspondiente del archivo de ayuda en la respuesta (consulte "Funciones de comprobación"). Está ahí. ISTool también es compatible con esto. Basta con mirar la pestaña "Común" de cualquier elemento en la sección "Secuencias de comandos". Si ya escribió funciones con un resultado booleano, simplemente puede elegirlas de un menú desplegable allí. –

+0

Sí, lo noté después de empezar a hacer esto. Parece que funciona y es lo más cercano al ideal que probablemente obtendré sin pasar horas y días investigando y haciendo un diálogo de progreso personalizado y esas cosas. Gracias :) – Davy8

Cuestiones relacionadas