使用嵌入式UI安装一个链嵌入MSI软件包的每 - 共同显示进度条(Install a chain o

2019-08-17 11:18发布

我使用Windows Installer 4.5的新功能和维克斯生成MSI包。

我曾经为了安装其他MSI包的集合作为交易创建的MSI安装链条。 每个包是使用新的嵌入式界面选项,这样的UI可以WPF 。 一切正常OK这么远。

除的目标之一将显示所有安装的共同进步吧。 在这一刻,有我在链安装程序的进度条,但是这一次达到100%之前,其他的包开始运行。

我看过一个帖子, 乐趣MsiEmbeddedChainer ,指出我想要什么就可以实现。 但我不能得到它的工作。 我想更详细一点的解释,也许一些代码示例。

Answer 1:

您可以通过发出手动控制进度条的状态INSTALLMESSAGE_PROGRESS消息的安装程序。 详细信息可以在这里找到:

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

特别是,你需要一个自定义操作来管理状态栏(这是什么会负责制定相应的调用MsiProcessMessage 。我建议你也用它来产卵子的安装程序。下面是一些伪代码来说明我心里有:

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

主要向下的一面是,进度条会有点断断续续地进行。 如果你真的想获得幻想,并使其更流畅,你可以启动一个单独的“侦听”线程将等待更新从子安装程序来进行细粒度的增量进度条。 就像是:

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

显然,每个子安装程序必须能够发出信号已经取得进展的主要安装程序,所以这将有可能需要跨您的产品更广泛的变化。 无论是值得的是你。



文章来源: Install a chain of embedded MSI packages each using an embedded UI - display common progress bar