wix - interfaces - Instale una cadena de paquetes incrustados de MSI, cada uno utilizando una interfaz de usuario incrustada: muestre la barra de progreso comĂșn
interfaz web ejemplos (1)
Puede controlar manualmente el estado de la barra de progreso emitiendo mensajes INSTALLMESSAGE_PROGRESS
al instalador. Detalles pueden ser encontrados aqui:
http://msdn.microsoft.com/en-us/library/aa370354.aspx
En particular, necesitará una acción personalizada para administrar la barra de estado (es lo que será responsable de realizar las llamadas apropiadas a MsiProcessMessage
. Le recomiendo que también lo use para generar los subinstaladores. Aquí hay algunos pseudocódigos para ilustrar lo que tengo en mente:
LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
// Initialize the progress bar range and position
MsiProcessMessage(current_installer, reset_message); // see MSDN for details
for each (subinstaller in list_of_installers)
{
launch subinstaller; // see MSDN for details
// Update the progress bar to reflect most recent changes
MsiProcessMessage(current_installer, increment_message); // see MSDN for details
}
return (result);
}
El inconveniente principal es que la barra de progreso progresará de una manera un tanto agitada. Si realmente desea hacerse más elegante y hacerlo más suave, podría iniciar un hilo "detector" separado que esperaría actualizaciones del subinstalador para hacer incrementos más finos a la barra de progreso. Algo como:
LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
// Initialize the progress bar range and position
MsiProcessMessage(current_installer, reset_message); // see MSDN for details
launch_listener_thread(); // launches listener_thread_proc (see below)
for each (subinstaller in list_of_installers)
{
launch subinstaller; // see MSDN for details
}
tell_listener_thread_to_stop();
optionally_wait_for_listener_thread_to_die();
return (result);
}
void listener_thread_proc()
{
// Loop until told to stop
while (!time_for_me_to_stop)
{
// Listen for update from sub-installer
timed_wait_for_update(); // probably required IPC, perhaps a named event?
// Only update the progress bar if an update message was actually received
if (!timeout)
{
// Update the progress bar to reflect most recent changes
MsiProcessMessage(current_installer, increment_message); // see MSDN for details
}
}
}
Obviamente, cada subinstalador debería poder indicar al instalador principal que se ha realizado el progreso, por lo que posiblemente requiera cambios más extensos en su producto. Si eso vale la pena o no, depende de usted.
Estoy usando las nuevas características de Windows Installer 4.5 y WiX para generar paquetes MSI .
Creé una instalación de cadena MSI para instalar una colección de otros paquetes MSI como transacción. Cada paquete está utilizando la nueva opción Embedded UI para que la interfaz de usuario pueda ser WPF . Todo funciona bien hasta ahora.
Excepto que uno de los objetivos sería mostrar una barra de progreso común para todas las instalaciones. En este momento, tengo una barra de progreso en el instalador de la cadena, pero esta alcanza el 100% antes de que los otros paquetes comiencen a ejecutarse.
He leído una publicación, Fun with MsiEmbeddedChainer , que dice que lo que quiero se puede lograr. Pero no puedo hacer que funcione. Me gustaría explicaciones un poco más detalladas y tal vez algunas muestras de código.