2008-09-30 2 views
6

J'utilise les nouvelles fonctionnalités de Windows Installer 4.5 et WiX pour générer des packages MSI.Installer une chaîne de packages MSI incorporés utilisant chacun une barre de progression commune de l'interface utilisateur incorporée

J'ai créé une installation en chaîne MSI afin d'installer une collection d'autres packages MSI en tant que transaction. Chaque package utilise la nouvelle option Embedded UI afin que l'interface utilisateur puisse être WPF. Tout fonctionne bien jusqu'ici. À l'exception de l'un des objectifs serait d'afficher une barre de progression commune pour toutes les installations. À ce moment, j'ai une barre de progression dans l'installateur de la chaîne, mais celle-ci atteint 100% avant que les autres paquets commencent à s'exécuter.

J'ai lu un post, Fun with MsiEmbeddedChainer, qui indique que ce que je veux peut être atteint. Mais je ne peux pas le faire fonctionner. Je voudrais des explications un peu plus détaillées et peut-être quelques exemples de code.

+0

Avez-vous des informations sur l'utilisation de l'interface utilisateur WPF avec WIX? Été à la recherche de comment utiliser l'option Embedded UI et n'a pas trouvé d'exemples. –

Répondre

5

Vous pouvez contrôler manuellement l'état de la barre de progression en envoyant des messages INSTALLMESSAGE_PROGRESS au programme d'installation. Les détails peuvent être trouvés ici:

http://msdn.microsoft.com/en-us/library/aa370354.aspx

En particulier, vous aurez besoin d'une action personnalisée pour gérer la barre d'état (il est ce qui sera responsable de faire les appels appropriés à MsiProcessMessage je vous recommande également. l'utiliser pour reproduire les sous-programmes d'installation Voici quelques pseudocode pour illustrer ce que je pense.

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); 
} 

la principale vers le bas-côté est que la barre de progression progressera de manière un peu saccadée Si tu voulais vraiment. pour obtenir plus de fantaisie et le rendre plus lisse, vous pouvez lancer un thread "écouteur" séparé qui attendrait pour les mises à jour du sous-programme d'installation afin d'effectuer des incréments plus précis dans la barre de progression. Quelque chose comme:

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 
     } 
    } 
} 

Il est évident que chaque sous-programme d'installation devrait être en mesure de signaler l'installateur principal que des progrès ont été réalisés, donc cela nécessitera potentiellement des modifications plus importantes au sein de votre produit. Que cela vaille ou non l'effort vous appartient.

Questions connexes