¿Cómo se hace la disposición de Inno no parece congelada en el desempeño de un largo Exec?

StackOverflow https://stackoverflow.com/questions/591899

  •  09-09-2019
  •  | 
  •  

Pregunta

La larga Exec es la instalación de .NET 3.5, y el guión a cabo se basa fuera éste: http: //www.blackhillsoftware. com / blog / 2006/06/26 / usando-ınnosetup-con-el-dotnet-marco /

El problema es que se trata de utilizar "ewWaitUntilTerminated" porque tenemos que capturar el código de salida. Se hace un poco peor por el hecho de que nos estamos quedando it / pasiva / norestart por lo que es menos trabajo por parte del usuario (tal vez deberíamos no?)

La opción más fácil que podía pensar es ocultar la ventana mientras está instalándose .NET y mostrando de nuevo después de que se hace, pero no estoy seguro de cómo hacer eso.

La solución ideal sería mostrar una página de progreso, pero no parece que sería posible, ya que tendríamos que volver de inmediato, pero de alguna manera todavía una notificación cuando el proceso finalice y capturar el código de salida de otro modo sólo tendríamos una barra de progreso eterno.

¿Alguna idea sobre cómo hacer esto?

Editar: Minimizando probablemente sería mejor, pero no está seguro de cómo hacerlo bien. Nosotros mostramos un mensaje informando al usuario de que el proceso puede durar 10-20 minutos, sin embargo, el problema es que la forma de instalación principal está completamente congelado, no se puede mover, minimizar o hacer nada con ella. También se ejecuta / pasivo el instalador .NET en realidad no muestra ningún progreso durante un minuto o dos en una máquina más lenta.

¿Fue útil?

Solución

Hemos necesarios para instalar .NET con un par de productos, y hemos tomado dos enfoques:

  • Al instalar .NET con InnoSetup, dejamos que el usuario sepa que la instalación va a tomar mucho tiempo, y para esperar un cierto mensaje cuando se haya completado
  • Empezamos el .NET estableció sin banderas para forzar al cliente a través de él. De esta manera si están más inclinados técnicamente saben por qué la instalación está tomando tanto tiempo

Hemos tenido honestamente mejor suerte con la segunda opción, sobre todo ahora que los administradores de sistemas más parecen bloquear los escritorios hasta cierto punto.

Otros consejos

Una forma de hacer InnoSetup "no se ven congelado" es añadir un indicador de progreso "falso", como una carpa, para mostrar que algo está pasando. Pero esto no va a resolver la "ventana no dragable / móvil" problema.

Por lo tanto, otra forma es para descongelar realmente la GUI InnoSetup, mientras se ejecuta un proceso de larga duración:

El "proceso de larga ejecución" se ejecuta a través de ShellExecuteEx (). A continuación, el instalador utiliza un bucle mientras que con la condición WaitForSingleObject y un tiempo de espera muy mínimo para ejecutar AppProcessMessage.

AppProcessMessage es en sí mismo una función de ayuda. Se utiliza el código "genérico" para recrear un "Application.ProcessMessages" procedimiento -ish, utilizando la función API de Windows PeekMessage(), TranslateMessage() y DispatchMessage(). Su trabajo es ser la bomba mensaje a la interfaz gráfica de usuario InnoSetup.

Este truco hace que la ventana de respuesta / dragable de nuevo, mientras que el "proceso de larga ejecución" se procesa en el fondo.

Esta es la fuente para el bucle de ejecución:

  if ShellExecuteEx(ExecInfo) then
  begin
    while WaitForSingleObject(ExecInfo.hProcess, 100) = WAIT_TIMEOUT
    do begin
        AppProcessMessage;
        WizardForm.Refresh();
    end;
  CloseHandle(ExecInfo.hProcess);
  end;

La siguiente GIST para unzip.iss contiene el código de un Descomprimir ayudante para la ejecución de 7zip sin bloquear la interfaz gráfica de usuario InnoSetup , incluyendo las partes y piezas para trabajar con la función AppProcessMessage.

En este caso "descomprimir" es solo un ejemplo y que podría sustituir a la aplicación que se ejecuta con lo que sea, un instalador .Net o cualquier otra tarea de larga ejecución.

A pesar de que probablemente sería fácil, no recomiendo que oculta su instalador mientras el instalador se ejecuta .Net. He visto otros instaladores que hacen, y cuando esto sucede, creo que la instalación ha finalizado, y entonces estoy confundido cuando me parece que no es verdad. (Y cuando la instalación realmente está acabado, no puedo estar seguro de eso, tampoco. Es posible que simplemente se ocultó de nuevo.)

Se pueden visualizar las páginas personalizadas del asistente Inno Setup. Haciendo una página parecido muestran una barra de progreso y mantenerla exacta, probablemente sería un desafío, pero al menos se podría mostrar un mensaje en la página del asistente diciendo que el instalador está esperando a que el instalador .Net antes de proceder. Vea la sección "Uso de Custom Wizard Páginas" del archivo de ayuda.

Simplemente puede ocultar el formulario asistente de instalación llamando

WizardForm.Hide;
Exec(...);
WizardForm.Show;

aunque estoy de acuerdo que esto no es muy bonita.

Han pasado 5 años desde que ha hecho la pregunta, pero aquí está mi respuesta de todos modos.

Antes de llamar a Exec () se puede establecer el mensaje que se muestra mediante la disposición de Inno por encima de la barra de progreso principal de la siguiente manera:

WizardForm.StatusLabel.Caption := 'Installing .NET Framework 3.5. Please wait, this can take up to 1 hour...';
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top